如果实体实例是作为查询子实体属性的结果加载的,是否有办法优雅地加载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 ()
子句。我的问题是:实体框架能否以优雅的方式实现这一目标?我想出了一些有效的黑客,但感觉不对。
答案 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。