2010-12-20 10 views
1

エンティティ・インスタンスが子エンティティ属性の問合せの結果としてロードされた場合、EFエンティティのすべての子エンティティをエレガントにロードする方法はありますか?ここで私が求めているものの簡単な例です:エンティティ・フレームワーク:子エンティティ属性に基づいて問合せからすべての子エンティティをリロード

まず、いくつかの単純なデータ表:

CREATE TABLE Invoices 
(
    InvoiceID int IDENTITY(1000,1) NOT NULL, 
    Customer nvarchar(50) NOT NULL, 
    InvoiceDate datetime NOT NULL, 
    CONSTRAINT PK_Invoices PRIMARY KEY (InvoiceID) 
) 

CREATE TABLE InvoiceItems 
(
    InvoiceItemID int IDENTITY(1,10) NOT NULL, 
    InvoiceFK int NOT NULL, 
    PurchasedItem varchar(24) NULL, 
    Quantity decimal(10,2) NULL, 
    ItemPrice money NULL, 
    CONSTRAINT PK_InvoiceItems PRIMARY KEY (InvoiceItemID), 
    CONSTRAINT FK_InvoiceItems_Invoice FOREIGN KEY (InvoiceFK) 
     REFERENCES Invoices (InvoiceID) 
) 

今、私たちがしたいことは、一致する請求書の項目に基づいて請求書テーブルを照会することですが、へその後、関係なく、それが基準に一致するかどうかの選択した各請求書のすべての項目を表示:

var qryOrders = from ordr in ctx.InvoiceItems 
       .Include("Invoice") 
       where ordr.PurchasedItem == "Buggy Whips" 
       select ordr; 

foreach (var ordrItm in qryOrders) 
{ 
    Console.WriteLine("Order " + ordrItm.Invoice.InvoiceID + " contains buggy whips"); 
    Console.WriteLine("Full contents of order:"); 

    foreach (var itm in ordrItm.Invoice.InvoiceItems) 
    { 
     //this will only show the buggy whip item 
     Console.WriteLine(itm.PurchasedItem); 
    } 
} 

は私がしたいことはバギー鞭ない項目を含め、「バギー鞭」が含まれ、各注文内のすべての注文項目を表示することです。これをSQLで書いていたら、WHERE InvoiceID IN()句をサブクエリで使用します。私の質問です:エンティティフレームワークは、これをエレガントな方法で行うことができますか?私は働くいくつかのハッキングを思いついたが、正しいことは何もない。

答えて

0

かなり紛らわしい質問 - しかし、私はこの声明に答えるためにしようとします:

私がしたいことはバギー鞭ない項目を含め、「バギー鞭」が含まれ、それぞれ順に、すべての注文項目を表示することです。

私はあなたの周りInvoiceItems /請求書を反転する必要があると思う:

var query = ctx.Invoices.Include("InvoiceItems") 
       .Where(x => x.InvoiceItems.Any(y => y.PurchasedItem == "Buggy Whips")) 
       .Select(x => x.Invoices); 

そのクエリは「バギー鞭」の少なくとも1件の購入した商品で持っている、Invoicesのコレクションを返します。

あなたが購入したアイテムのすべては「バギー鞭」ですInvoicesのコレクションを返すようにしたい場合は、.All.Anyを交換してください。

これがあなたの後にあるかどうかわかりません。私を混乱させる

部分はこれです:私はSQLでこれを書いていた場合

、私はサブクエリ

InvoiceIDでInvoiceID IN()句を使用するInvoicesでありますテーブル - 項目名(PurchasedItem)はInvoiceItemsテーブルにあります - どうすればうまくいくのですか?

おそらく、サンプルSQLクエリを作成した場合は、LINQ-Entitiesに変換するのに役立ちます。

+0

紛らわしい質問を正しく解釈しました。ありがとうございます! –

+1

@Paul Keister - 本当ですか?うわー - 幸運な推測。 :) – RPM1984

関連する問題