2017-08-11 17 views
0

OrderByから使用するとこのエラーが発生します。DbSortClause式は、同等の順序の型でなければなりません。パラメータ名:キー。 私はこのコードDbSortClause式は、比較可能な順序の型でなければなりません。パラメータ名:キー

var resAsc = this.Context.Set<TEntity>().AsNoTracking().Where(predicate: predicate).OrderBy(s => sortItem.SortItems.Select(w => w.SortText).ToList()).Skip(page * size).Take(page).ToList().AsQueryable(); 

を変更する方法がわからないどのように私はそれを解決することができますか?

編集:私は、たとえば、この方法に

string test = "Id"; 
     SortOption objsort = new SortOption(); 
     objsort.SortItems = new List<SortItem>(); 
     objsort.SortItems.Add(new SortItem { SortText = "Id" }); 
     objsort.SortOrderType = EnumTypes.SortOrder.Ascending; 
     var res = ApplicationService.SearchPage(w => w.Id > 2, objsort, 1, 3); 

をパラメータを送信したいと今、私はここに

public Paginated<TEntity> SearchPage(Expression<Func<TEntity, bool>> predicate, SortOption sortItem, int page, int size) 
    { 
     Paginated<TEntity> objPage = new Paginated<TEntity>(); 
     if (sortItem.SortOrderType == EnumTypes.SortOrder.Ascending) 
     { 

      var resAsc = this.Context.Set<TEntity>().AsNoTracking().Where(predicate: predicate).OrderBy(s => sortItem.SortItems.Select(w => w.SortText).ToList()).Skip(page * size).Take(page).ToList().AsQueryable(); 
      objPage.Data = resAsc; 
      objPage.TotalCount = this.Context.Set<TEntity>().Count(); 
      return objPage; 
     } 
     var resDesc = this.Context.Set<TEntity>().AsNoTracking().Where(predicate: predicate).OrderByDescending(s => sortItem.SortItems.Select(w => w.SortText)).Skip(page * size).Take(page).ToList().AsQueryable(); 
     objPage.Data = resDesc; 
     objPage.TotalCount = this.Context.Set<TEntity>().Count(); 
     return objPage; 

    } 

これらのパラメータを取得し、実際、私はここに var resAsc = this.Context.Set<TEntity>().AsNoTracking().Where(predicate: predicate).OrderBy(s => s.Id).Skip(page * size).Take(page).ToList().AsQueryable();

でこの Idを取得したいです
+1

問題は、リストのリストを注文しようとしていることです。 IEnumerableは 'IComparable'を実装していないので、これは不可能です。何を正確に注文しようとしていますか? – NtFreX

+0

@NtFreX私の質問を編集する、私はちょうどこの 'ortItem.SortItems.Select(w => w.SortText)'からIDを取得したい –

答えて

1

次のコードを使用するか、それからインスピレーションを得ることができます。それはPrepareと呼ばれる拡張方法IEnumerable<TEntity>を与えます。このメソッドは、述語と一致する項目を選択し、エンティティを順序付けし、それにfinnalyページを付けます。

多くの場合、ColumnOrderConfiguration個のオブジェクトを指定できます。正しい結果を作成するには、OrderByThenByを使用します。

データベースで作業する場合、IEnumerableの代わりにFunc<,>IDbSetの代わりにExpression<Func<,>>を使用する必要があります。

public class ColumnOrderConfiguration<TEntity> 
{ 
    public Func<TEntity, object> ValueSelector { get; set; } = entity => null; 
    public SortOrder SortOrder { get; set; } = SortOrder.Ascending; 
} 

public static class CollectionPreparationExtensions 
{ 
    public static IEnumerable<TEntity> Prepare<TEntity>(this IEnumerable<TEntity> entities, Func<TEntity, bool> predicate, IEnumerable<ColumnOrderConfiguration<TEntity>> orderConfiguration, int pageIndex, int pageSize) 
     => entities.Where(predicate).OrderBy(orderConfiguration).Skip(pageIndex * pageSize).Take(pageSize); 

    private static IEnumerable<TEntity> OrderBy<TEntity>(this IEnumerable<TEntity> entities, IEnumerable<ColumnOrderConfiguration<TEntity>> orderConfiguration) 
    { 
     var configurations = orderConfiguration.ToArray(); 

     if (!configurations.Any()) 
      return entities; 

     var firstOrderConfiguration = configurations.First(); 
     var orderedEntities = entities.OrderBy(firstOrderConfiguration.ValueSelector, firstOrderConfiguration.SortOrder); 

     for (var i = 1; i < configurations.Length; i++) 
     { 
      orderedEntities = orderedEntities.ThenBy(configurations[i].ValueSelector, configurations[i].SortOrder); 
     } 
     return orderedEntities; 
    } 

    private static IOrderedEnumerable<TEntity> ThenBy<TEntity>(this IOrderedEnumerable<TEntity> entities, Func<TEntity, object> valueSelector, SortOrder sortOrder) 
    { 
     if (sortOrder == SortOrder.Descending) 
      return entities.ThenByDescending(valueSelector); 
     return entities.ThenBy(valueSelector); 
    } 
    private static IOrderedEnumerable<TEntity> OrderBy<TEntity>(this IEnumerable<TEntity> entities, Func<TEntity, object> valueSelector, SortOrder sortOrder) 
    { 
     if (sortOrder == SortOrder.Descending) 
      return entities.OrderByDescending(valueSelector); 
     return entities.OrderBy(valueSelector); 
    } 
} 

これは使い方です。

public class MyTestEntity 
{ 
    public bool IsTrue { get; set; } 
    public string OrderText { get; set; } 
    public int ThenOrderBy { get; set; } 
} 

var entities = new List<MyTestEntity>(new [] 
{ 
    new MyTestEntity { IsTrue = true, OrderText = "1234", ThenOrderBy = 4321 }, 
    new MyTestEntity { IsTrue = true, OrderText = "000001", ThenOrderBy = 000001 }, 
    new MyTestEntity { IsTrue = false } 
}); 
var searchPredicate = new Func<MyTestEntity, bool>(entity => entity.IsTrue); 
var orderConfig = new List<ColumnOrderConfiguration<MyTestEntity>>(new [] 
{ 
    // first order by `OrderText` ascending 
    new ColumnOrderConfiguration<MyTestEntity> 
    { 
     ValueSelector = entity => entity.OrderText, 
     SortOrder = SortOrder.Ascending 
    }, 
    // then order by `ThenOrderBy` descending 
    new ColumnOrderConfiguration<MyTestEntity> 
    { 
     ValueSelector = entity => entity.ThenOrderBy, 
     SortOrder = SortOrder.Descending 
    } 
}); 
var pageIndex = 0; 
var pageSize = 20; 

var result = entities.Prepare(searchPredicate, orderConfig, pageIndex, pageSize); 
関連する問題