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

Entity framework 实体框架:根据子实体属性从查询中重新加载所有子实体,entity-framework,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

如果实体实例是作为子实体属性查询的结果加载的,是否有一种方法可以优雅地加载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”的所有订单项,包括不是Buggy Whips的项。如果我是用SQL编写的,我会在子查询中使用
WHERE InvoiceID in()
子句。我的问题是:实体框架能否以优雅的方式实现这一点?我提出了一些可行的方法,但没有一种感觉是正确的。

这个问题相当令人困惑,但我将尝试回答以下陈述:

我想要的是显示每个订单中包含“Buggy Whips”的所有订单项,包括不是Buggy Whips的项

我认为您需要翻转发票项目/发票:

var query = ctx.Invoices.Include("InvoiceItems")
               .Where(x => x.InvoiceItems.Any(y => y.PurchasedItem == "Buggy Whips"))
               .Select(x => x.Invoices);
该查询将返回
发票的集合,其中至少有一个购买的“Buggy Whips”物品

如果您想返回
发票的集合,其中所有购买的物品都是“Buggy Whips”,请将
.Any
替换为
.all

不确定这是否是你的目标

让我困惑的是:

如果我是用SQL编写的,我会在子查询中使用WHERE InvoiceID in()子句

InvoiceID
Invoices
表中-但是项目名称(PurchasedItem)在
InvoiceItems
表中-那么这是如何工作的呢


如果您编写了一个SQL查询示例,我们可能会帮助您将其转换为LINQ实体。

您已经正确地解释了我令人困惑的问题,谢谢!