【问题标题】:How to dynamically Filter an IEnumerable如何动态过滤 IEnumerable
【发布时间】:2014-03-04 02:50:08
【问题描述】:

我需要使用 LINQ 构建一个动态查询来过滤 IEnumerable 的元素 - 它用作 Repeater 控件上的 SelectMethod - 以显示来自我的实体模型的正确数据。我真的不知道从哪里开始。

vb 或 c# 都可以,我更喜欢 LINQ 的基于方法的语法,而不是查询表达式语法,但无论如何都能完成工作......

HTML

<asp:Repeater ID="pList" runat="server" ItemType="rsDataAccess.Product" SelectMethod="GetProducts">
  <ItemTemplate>
     ...
  </ItemTemplate>
</asp:Repeater>

我想要完成的坏例子

Public Function GetProducts() As IEnumerable(Of Product)

  Dim products As Product =
  repo.Product.Where(Function(r) r.Status = "Open")

  Dim query As String = ""

  If option1 = True Then
    query += "Where(function(r) r.Price > 100)"
  End If

  If option2 = True Then
    query += "Where(function(r) r.Zip = 63039 "
  End If

  products += query

  Return products
End Function

objectContext.CreateQuery() 是唯一一个(据我所知)可以提供我需要的功能的功能,但我的猜测是有更好的方法。所以,请告诉我更好的方法是什么。

我知道我可以在 if 语句中返回 IEnumerable,但这不是我想要的。

If option1 = True Then
  Return repo.Products.Where(Function(r) r.Price > 100)
End If

If option2 = True Then
  Return repo.Products.Where(Function(r) r.Zip = 63039)
End If

【问题讨论】:

  • 我知道您正在寻找一种在 linq 中进行动态操作的方法吗?
  • @PandaZhang 是的,没错

标签: asp.net vb.net entity-framework model-binding


【解决方案1】:

未优化,但应该可以完成工作:

Public Function GetProducts() As IEnumerable(Of Product)

   Dim products As IEnumerable(Of Product) =
     repo.Product.Where(Function(r) r.Status = "Open")

   If option1 Then
       products = products.Concat(repo.Product.Where(function(r) r.Price > 100))
   End If

   If option2 Then
       products = products.Concat(repo.Product.Where(function(r) r.Zip = 63039))
   End If

   Return products.Distinct()
End Function

【讨论】:

  • 这不起作用,因为未应用 Where 子句;但是,您确实使我找到了最快的解决方案。产品 = products.Where(function(r) r.zip = 63039)。无论出于何种原因,我认为不能将子句附加到 IEnumerable... 谢谢
  • 我认为你和我对 += 运算符应该对可枚举做什么有不同的想法。
  • 在另一个项目上再次遇到这个问题。这正是我所需要的。起初我对你的解决方案有同样的问题(原因)。我添加了最初的 Where 子句,它就像一个魅力。例如: products = products.Concat(repo.Product.Where(function(r) r.Price > 100 AndAlso r.Status = "Open" ))
【解决方案2】:

对于linq中的动态where子句,我一般按照Build Where Clause Dynamically in Linq提到的方式。

这篇文章是用表达式树来实现动态的,有点复杂,但我认为结果很优雅,而且是用C#编写的,希望可以帮助你对此有所了解。

【讨论】:

  • 这看起来很有希望!
  • @KRob.Haha,是的,从我的角度来看,Expression Tree 是 .NET 提供的一项了不起的功能,无论其复杂性如何:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 2021-11-04
  • 2017-01-25
  • 1970-01-01
相关资源
最近更新 更多