2010-12-20 56 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