实体框架:根据子实体属性从查询中重新加载所有子实体

时间:2010-12-20 23:14:56

标签: entity-framework

如果实体实例是作为查询子实体属性的结果加载的,是否有办法优雅地加载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);
    }
}

我想要的是显示包含“Buggy Whips”的每个订单中的所有订单商品,包括不是马车鞭子的商品。如果我在SQL中编写它,我会使用带有子查询的WHERE InvoiceID IN ()子句。我的问题是:实体框架能否以优雅的方式实现这一目标?我想出了一些有效的黑客,但感觉不对。

1 个答案:

答案 0 :(得分:0)

相当令人困惑的问题 - 但我会尝试回答这个陈述:

  

我想要的是显示包含“Buggy Whips”的每个订单中的所有订单商品,包括不是马车鞭子的商品。

我认为你需要翻转InvoiceItems / Invoice:

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

该查询将返回Invoices的集合,其中包含至少一个购买的“Buggy Whips”项目。

如果您想要返回Invoices的集合,其中所有购买的商品都是“Buggy Whips”,请将.Any替换为.All

不确定这是不是你的事。

令我困惑的是:

  

如果我在SQL中写这个,我会使用WHERE InvoiceID IN()子句和子查询

InvoiceID位于Invoices表上 - 但项目名称(PurchasedItem)位于InvoiceItems表格上 - 那么它将如何运作?

也许如果您编写了一个示例SQL查询,我们可以帮助您将其转换为LINQ-Entities。