2009-08-13 2 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

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

Существует хороший article here на динамических поисковых запросов в Linq с VB путем создания дерева выражений вручную ... совсем немного работы. Или другой (лучше?) Вариант этой статьи на 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)).

EDIT:

System.Linq.Expressions пространство имен позволяет создавать функции во время выполнения. Этот коэффициент использует эту функцию для создания функции, которая получает свойство. Поскольку метод Compile (который фактически создает функцию) работает несколько медленно, лучше использовать каждый сгенерированный делегат.

+0

Это кажется сложным – Jason

+0

Это, однако, самый короткий способ сделать это. – SLaks

Смежные вопросы