2009-08-13 119 views
1

我对LINQ相对比较陌生,但我会更深入地了解它。以下是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的声明,但我不知道究竟如何?

谢谢!

回答

3

你可以这样做:

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() 

它并不完美,但至少它是更少的代码复制......,你可以把它转换成一个单一的查询会是这样的

+0

我喜欢这个......这似乎很简单 – Jason 2009-08-13 23:03:22

0

一种方式:

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 
0

有对LINQ的动态searchs用VB一个不错的article here通过手动创建一个表达式树......相当多的工作。或另一个(更好?)选项是Dynamic Linq上的这篇文章(这里的例子是在C#中)

1

您可以使用LINQ表达式,像这样的:(我的VB是生锈,所以这可能不是编译)

Dim param = Expression.Parameter(GetType(OrderItem), "item") 
Dim getter = Expression.Lambda(Of Func(Of OrderItem, Integer))(_ 
    Expression.Property(param, whichForm.ToString()), _ 
    param _ 
).Compile() 

Return items.Where(Function(item) getter(item) == formId) 

为了获得最佳性能,在Dictionary(Of ItemsFor, Func(Of OrderItem, Integer))缓存产生的代表。

编辑

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

+0

这看起来很复杂 – Jason 2009-08-13 23:03:53

+0

然而,这是最简单的方法。 – SLaks 2009-08-13 23:10:18

相关问题