Linq 查询中的动态位置以获取所有结果或限制为一个

Dynamic Where in Linq query to get all results or limit by one

我有一个 linq 查询可以获取我需要的数据。然后我使用 For Each 循环来处理它。

Dim PickCustomer as string = "Some Customer"

Dim CustQuery = From Cust In myCustTable _
Select CustomerID = Cust.CustomerID, _
    CustName = Cust.Name, _
Order By CustomerID Ascending

For Each MyCust In CustQuery


Next

如何动态更改查询?如果 PickCustomer = "" 那么我想要所有的结果。但是,如果 PickCustomer 有一个名称(任何长度 > 0),那么我想将我的 linq 查询限制为仅该客户。喜欢Where (CustName = PickCustomer)

我一直在检查动态 Linq 查询,但我不能让它正常工作。

由于 LINQ 查询是惰性求值的,因此您可以分阶段构建,因此在这种情况下您实际上不需要任何动态,只需要一个 If.

例如像这样(未经测试):

Dim PickCustomer As String = ""

Dim CustQuery = From Cust In myCustTable
If Not String.IsNullOrWhiteSpace(PickCustomer) Then
    CustQuery = From Cust In CustQuery
                Where Cust.Name = PickCustomer
End If
CustQuery = From Cust In CustQuery
            Select
                CustomerID = Cust.CustomerID,
                CustName = Cust.Name
            Order By CustomerID Ascending

For Each MyCust In CustQuery

Next

我认为您不需要为此使用动态 Linq。只需添加一个处理这两种情况的 where 子句。类似于:

Where String.IsNullOrEmpty(PickCustomer) or (CustName = PickCustomer)

是的,我同意没有必要为此使用动态 LINQ。 您甚至可以在查询之外尝试逻辑,如下所示:

Dim MyCompany as string = "Consolidated Messenger"

Dim companies = 
    {"Consolidated Messenger", "Alpine Ski House", "Southridge Video", "City Power & Light", 
     "Coho Winery", "Wide World Importers", "Graphic Design Institute", "Adventure Works", 
     "Humongous Insurance", "Woodgrove Bank", "Margie's Travel", "Northwind Traders", 
     "Blue Yonder Airlines", "Trey Research", "The Phone Company", 
     "Wingtip Toys", "Lucerne Publishing", "Fourth Coffee"}

If MyCompany.length = 0 then
    For Each company As String In companies
        Console.WriteLine(company)
    Next     
Else
    Dim CompanyResult = 
        From company In companies where String.IsNullOrEmpty(company) or company.ToLower() = MyCompany.ToLower() select company
    For Each comp as String in CompanyResult
        Console.WriteLine(comp)
    Next
End If