0

フィールド名で注文できる汎用リポジトリに次のメソッドがあります。複数のフィールドで注文する方法を知る必要があります。

public IList<TEntity> FindByExpressionOrdered(Expression<Func<TEntity, bool>> filter,
                                                params Expression<Func<TEntity, object>>[] orderBy)
{
    IOrderedQueryable<TEntity> query = SessionScope.Current.Set<TEntity>().Where(filter).OrderBy(orderBy.First());
    if (orderBy.Length > 1)
    {
        for (int i = 1; i < orderBy.Length; i++)
        {
            query = query.ThenBy(orderBy[i]);
        }
    }
    return query.ToList();
}

上記を次のように呼び出すと、「型 'System.Int64' を型 'System.Object' にキャストできません。LINQ to Entities はエンティティ データ モデルのプリミティブ型のキャストのみをサポートします。」例外。

IList<Product> prods = IoC.Resolve<IRepository<Product>>().FindByExpressionOrdered(p => p.IsActive && p.IsFavorite, p => p.Name, p => p.Id);
4

1 に答える 1

1

Expression<Func<TEntity, object>>式の順序付けに使用できます。正常に機能するはずです。

次に、メソッドを次のように変更します

public IList<TEntity> FindByExpression(Expression<Func<TEntity, bool>> filter,
                                                    Expression<Func<TEntity, object>> subSelector,
                                                    params Expression<Func<TEntity, object>>[] orders)
{
    var query = SessionScope.Current.Set<TEntity>().Include(subSelector).Where(filter).OrderBy(m => true);
    query = orders.Aggregate(query, (current, order) => current.ThenBy(order));

    return query.ToList();
}

しかし、ある日、あなたは注文の方向を選択したくなるでしょう...そして、より賢い方法を見つけなければならないでしょう!

「OrderBy(m => true」) トリックがなく、コメントがあれば (同じ問題で、 orderBy params が空の配列の場合、これは失敗します)、私はそうします

var query = SessionScope.Current.Set<TEntity>()
                        .Include(subSelector)
                        .Where(filter)
                        .OrderBy(orderBy.First());
foreach (var order in orderBy.Skip(1))
   query = query.OrderBy(order);
于 2013-02-02T23:46:15.377 に答える