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

时间:2011-02-18 23:13:41

标签: c# linq lambda expression

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

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

这是我的存储库代码:

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();
}

另一方面,我并非100%确定我应该使用Expression<Func<TEntity, bool>>。出于某种原因,我觉得它应该是Expression<Func<TEntity, int>>,但我不太确定。

无论如何,如果有人能告诉我如何实际打电话,我真的很感激。如果你能使它像params论证那样工作,那么奖励点和爱。

1 个答案:

答案 0 :(得分: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();
}

然后将其用作SelectOrderedList(o1 => (o1.Something), o2 => (o2.SomethingElse)) ...

另外,为Descending写另一个:)

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