如何将OrderBy表达式数组传递给方法?

Gup*_*R4c 7 c# linq lambda expression

我正在尝试增强我的存储库,因此它是负责订购的人.我已经应用了这个问题的答案,就存储库而言,我很确定它已经完成了.

我遇到的问题是我不知道如何将数组传递给存储库中的方法.编译器不停地向我大吼大叫代表们.在上面的链接问题中,作者基本上是在做我想要的,所以它必须是可能的.

这是我的存储库代码:

public virtual IList<TEntity> SelectOrderedList(
    Expression<Func<TEntity, bool>>[] Orderers,
    bool Ascending = true) {
    IOrderedQueryable<TEntity> TemporaryQueryable = null;

    foreach (Expression<Func<TEntity, bool>> Orderer in Orderers) {
        if (TemporaryQueryable == null) {
            TemporaryQueryable = (Ascending ? this.ObjectSet.OrderBy(Orderer) : this.ObjectSet.OrderByDescending(Orderer));
        } else {
            TemporaryQueryable = (Ascending ? TemporaryQueryable.ThenBy(Orderer) : TemporaryQueryable.ThenByDescending(Orderer));
        };
    };

    return TemporaryQueryable.ToList();
}
Run Code Online (Sandbox Code Playgroud)

另外,我并不是100%肯定我应该使用Expression<Func<TEntity, bool>>.出于某种原因,我有一种感觉,它应该是Expression<Func<TEntity, int>>,但我不太确定.

无论如何,如果有人能告诉我如何实际打电话,我真的很感激.如果你可以让它像params争论一样工作,那么奖励积分和爱.

TDa*_*ver 7

public virtual IList<TEntity> SelectOrderedList(
    params Expression<Func<TEntity, IComparable>>[] Orderers) {
    IOrderedQueryable<TEntity> TemporaryQueryable = null;

    foreach (Expression<Func<TEntity, IComparable>> Orderer in Orderers) {
        if (TemporaryQueryable == null) {
            TemporaryQueryable = this.ObjectSet.OrderBy(Orderer);
        } else {
            TemporaryQueryable = TemporaryQueryable.ThenBy(Orderer);
        };
    };

    return TemporaryQueryable.ToList();
}
Run Code Online (Sandbox Code Playgroud)

那就把它用作SelectOrderedList(o1 => (o1.Something), o2 => (o2.SomethingElse))......

另外,为Descending写另一个:)

如果你想要一个,每个orderer可以升序或降序,用Tuple>,SortDirection>替换签名,但你不能使用带有隐式类型元组的隐式类型lambda(并且你也不能将它们与隐式表达式一起使用)那么,你' d使用它时有相当难看的代码......

  • +1,这肯定适用于LINQ to Objects,但我遇到了LINQ to Entities和`int`属性的问题.请参阅@Slauma的[此答案](http://stackoverflow.com/questions/8190480/how-to-pass-multiple-expressions-to-orderby-for-ef/8194829#8194829)获取解决方案. (3认同)