2010-12-20 50 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); 

該查詢將返回Invoices的集合,具有在至少一個「趕馬車的鞭子」的購買項目。

如果你想返回的Invoices一個集合,其中所有購買的物品的是「趕馬車的鞭子」,以取代.All.Any

不知道這是你之後。

,混淆我的一部分是這樣的:

如果我在SQL在寫這一點,我會用一個WHERE InvoiceID IN()子句中使用子查詢

InvoiceID是在Invoices表 - 但項目名稱(PurchasedItem)位於InvoiceItems表中 - 那麼這將如何工作?

也許如果你寫了一個示例SQL查詢,我們可以幫助你將它轉換爲LINQ實體。

+0

您正確地解釋了我令人困惑的問題,謝謝! – 2010-12-21 02:19:29

+1

@保羅·凱斯特 - 真的嗎?哇 - 幸運的猜測。 :) – RPM1984 2010-12-21 02:29:48