Asp.net 有没有更好的方法来执行此LINQ语句块?

Asp.net 有没有更好的方法来执行此LINQ语句块?,asp.net,vb.net,linq,refactoring,Asp.net,Vb.net,Linq,Refactoring,我对LINQ比较陌生,但我会更深入地了解它。以下是LINQ的一个实际应用,还是有更好的方法来做类似的事情 Public Shared Function GetItems(ByVal itemsList As List(Of OrderItem), ByVal whichForm As ItemsFor, ByVal formID As Integer) As List(Of OrderItem) Dim items As New List(Of OrderItem) Sele

我对LINQ比较陌生,但我会更深入地了解它。以下是LINQ的一个实际应用,还是有更好的方法来做类似的事情

Public Shared Function GetItems(ByVal itemsList As List(Of OrderItem), 
 ByVal whichForm As ItemsFor, ByVal formID As Integer) As List(Of OrderItem)
    Dim items As New List(Of OrderItem)
    Select Case whichForm
        Case ItemsFor.MfrCredit
            Dim query = From oi As OrderItem In itemsList _
Where oi.ManufacturerCreditID = formID Select oi
            items = query
        Case ItemsFor.CustomerCredit
            Dim query = From oi As OrderItem In itemsList _
 Where oi.CustomerCreditID = formID Select oi
            items = query
        Case ItemsFor.Invoice
            Dim query = From oi As OrderItem In itemsList _
 Where oi.InvoiceID = formID Select oi
            items = query
        Case ItemsFor.PurchaseOrder
            Dim query = From oi As OrderItem In itemsList _
 Where oi.PurchaseOrderID = formID Select oi
            items = query
        Case ItemsFor.Quote
            Dim query = From oi As OrderItem In itemsList _
 Where oi.QuoteID = formID Select oi
            items = query
        Case ItemsFor.StockingOrder
            Dim query = From oi As OrderItem In itemsList _
 Where oi.StockingOrderID = formID Select oi
            items = query
    End Select
    Return items
End Function
我在想,如果我能以某种方式将属性名作为一个对象,我可以只执行一个LINQ语句,但我不确定具体如何


谢谢

您可以执行以下操作:

Dim condition As Func(Of OrderItem, Boolean)
Select Case whichForm
    Case ItemsFor.MfrCredit
        condition = Function(oi As OrderItem) oi.ManufacturerCreditID = formID
    Case ItemsFor.CustomerCredit
        condition = Function(oi as OrderItem) oi.CustomerCreditID = formID
    ...
End Select
Return items.Where(condition).ToList()
Dim query = From oi As OrderItem In itemsList _
Where ((whichForm = ItemsFor.MfrCredit) and (oi.ManufacturerCreditID = formID)) _
or ((whichForm = ItemsFor.CustomerCredit) and (oi.CustomerCreditID = formID)) _
or ((whichForm = ItemsFor.Invoice) and (oi.InvoiceID = formID)) _
...
select oi
items = query

它并不完美,但至少代码重复较少…

您可以执行以下操作:

Dim condition As Func(Of OrderItem, Boolean)
Select Case whichForm
    Case ItemsFor.MfrCredit
        condition = Function(oi As OrderItem) oi.ManufacturerCreditID = formID
    Case ItemsFor.CustomerCredit
        condition = Function(oi as OrderItem) oi.CustomerCreditID = formID
    ...
End Select
Return items.Where(condition).ToList()
Dim query = From oi As OrderItem In itemsList _
Where ((whichForm = ItemsFor.MfrCredit) and (oi.ManufacturerCreditID = formID)) _
or ((whichForm = ItemsFor.CustomerCredit) and (oi.CustomerCreditID = formID)) _
or ((whichForm = ItemsFor.Invoice) and (oi.InvoiceID = formID)) _
...
select oi
items = query

它并不完美,但至少代码重复较少…

将其转换为单个查询的一种方法如下:

Dim condition As Func(Of OrderItem, Boolean)
Select Case whichForm
    Case ItemsFor.MfrCredit
        condition = Function(oi As OrderItem) oi.ManufacturerCreditID = formID
    Case ItemsFor.CustomerCredit
        condition = Function(oi as OrderItem) oi.CustomerCreditID = formID
    ...
End Select
Return items.Where(condition).ToList()
Dim query = From oi As OrderItem In itemsList _
Where ((whichForm = ItemsFor.MfrCredit) and (oi.ManufacturerCreditID = formID)) _
or ((whichForm = ItemsFor.CustomerCredit) and (oi.CustomerCreditID = formID)) _
or ((whichForm = ItemsFor.Invoice) and (oi.InvoiceID = formID)) _
...
select oi
items = query

将其转换为单个查询的一种方法如下:

Dim condition As Func(Of OrderItem, Boolean)
Select Case whichForm
    Case ItemsFor.MfrCredit
        condition = Function(oi As OrderItem) oi.ManufacturerCreditID = formID
    Case ItemsFor.CustomerCredit
        condition = Function(oi as OrderItem) oi.CustomerCreditID = formID
    ...
End Select
Return items.Where(condition).ToList()
Dim query = From oi As OrderItem In itemsList _
Where ((whichForm = ItemsFor.MfrCredit) and (oi.ManufacturerCreditID = formID)) _
or ((whichForm = ItemsFor.CustomerCredit) and (oi.CustomerCreditID = formID)) _
or ((whichForm = ItemsFor.Invoice) and (oi.InvoiceID = formID)) _
...
select oi
items = query
通过手动创建表达式树,在Linq和VB中有一个很好的动态搜索功能…相当多的工作。或者本文中的另一个(更好的?)选项(这里的例子是C#)

通过手动创建表达式树,在Linq和VB中有一个很好的动态搜索…相当多的工作。或者另一个(更好的?)选项是本文(这里的例子是C#)

您可以使用委托。我想象一个数组或谓词列表,每个谓词对应一个谓词项

那么你的问题是

Dim query = From oi As OrderItem In itemsList Where predicate select oi 
另请参见。
和。

您可以使用代理。我想象一个数组或谓词列表,每个谓词对应一个谓词项

那么你的问题是

Dim query = From oi As OrderItem In itemsList Where predicate select oi 
另请参见。

并且。

您可以使用LINQ表达式,如下所示:(我的VB已经生锈,因此可能无法编译)

为了获得最佳性能,请将生成的委托缓存在
字典中(对于ItemsFor,Func(对于OrderItem,Integer))

编辑


System.Linq.Expressions
命名空间允许您在运行时创建函数。此coe使用该功能创建获取属性的函数。由于编译方法(实际上创建函数)有点慢,因此最好重用每个生成的委托。

可以使用LINQ表达式,如下所示:(我的VB生锈了,所以可能无法编译)

为了获得最佳性能,请将生成的委托缓存在
字典中(对于ItemsFor,Func(对于OrderItem,Integer))

编辑


System.Linq.Expressions
命名空间允许您在运行时创建函数。此coe使用该功能创建获取属性的函数。由于
Compile
方法(实际上创建函数)有点慢,因此最好重用每个生成的委托。

我喜欢这样。。。这看起来很简单,就像这样。。。这似乎很简单,但是,这是最短的方法。