2009-08-13 4 views
1

私はLINQで比較的新しいですが、もっと多くのことに取り掛かるつもりです。 LINQの実用的なアプリケーションは次のようなものか、これを行う良い方法がありますか?私は...私はちょうど1つの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 

私が考えていました! ...あなたのようなものになるだろう単一のクエリにそれを回すことができる

答えて

3

あなたのような何かをすることができます:

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

私はこれが好きです...これは単純なようです – Jason

0

片道

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

VBでLINQの動的検索設定上の素敵な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))で生成されたデリゲートをキャッシュします。

EDIT

System.Linq.Expressions名前空間には、実行時に関数を作成することができます。この係数は、この機能を使用してプロパティを取得する関数を作成します。 Compile(実際に関数を作成する)メソッドは多少遅いので、生成された各デリゲートを再利用する方が良いでしょう。

+0

これは複雑に見えます – Jason

+0

しかし、これは最短の方法です。 – SLaks

関連する問題