【问题标题】:How to pass an array of OrderBy expression to a method?如何将 OrderBy 表达式数组传递给方法?
【发布时间】:2011-06-30 04:09:29
【问题描述】:

我正在尝试增强我的存储库,以便它负责订购。我已经应用了来自 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&lt;Func&lt;TEntity, bool&gt;&gt;。出于某种原因,我感觉应该是Expression&lt;Func&lt;TEntity, int&gt;&gt;,但我不太确定。

无论如何,如果有人能告诉我如何实际调用它,我将不胜感激。如果你能让它像params 参数一样工作,那么奖励积分和爱。

【问题讨论】:

  • Re the bool/int/etc - 这是被比较的 member 的类型。所以对于字符串属性,它是字符串。
  • 不要传递 Exp>[],而是传递 IOrderer[](将第二个 Type 参数排除在外)stackoverflow.com/questions/225481/…跨度>
  • @David,虽然我喜欢你的建议,但我不确定如何实施它,而且你在链接问题中的回答并没有真正给我一个对我有意义的解决方案。在一天结束时,我想做类似的事情:SelectOrderedList(o1 =&gt; (o1.Something), o2 =&gt; (o2.SomethingElse))。所以我想将多个表达式传递给该方法,以便它们可以执行 OrderBy/ThenBy...

标签: c# linq lambda expression


【解决方案1】:
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 =&gt; (o1.Something), o2 =&gt; (o2.SomethingElse))...

另外,为降序写另一个:)

如果你想要一个,其中每个排序器可以升序或降序,用 Tuple>,SortDirection> 替换签名但是你不能使用隐式类型的 lambdas 和隐式类型的元组(你也不能使用隐式表达式)所以然后, 使用它时你的代码会很丑陋...

【讨论】:

  • 谢谢,这正是我想要的。
  • +1,这绝对适用于 LINQ to Objects,但我遇到了 LINQ to Entities 和 int 属性的问题。请参阅@Slauma 的this answer 以获得解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多