我需要使用LINQ构建一个动态查询来过滤IEnumerable
的元素 - 它在SelectMethod
控件上用作Repeater
- 以显示来自我的实体的正确数据模型。我真的不知道从哪里开始。
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
答案 0 :(得分:1)
对于linq中的dynamic where子句,我通常按照Build Where Clause Dynamically in Linq提到的方式进行操作。
文章使用Expression树来实现动态有点复杂的地方,但结果在我看来很优雅,并且用C#编写,希望可以帮助你提出一些有关它的想法。
答案 1 :(得分: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