C# Entity Framework:Linq 对孙子进行筛选,并对具有属性的父进行 Select

C# Entity Framework: Linq Filter on GrandChildren and Conduct a Select on the Parent with Attributes

我们公司目前正在使用 Entity Framework Net Core 2.2 和 Sql Server

正在尝试查找购买了特定产品输入参数的所有不同客户。 编写了以下 EF Linq 查询以获取不同的客户。

后来又出现了一个问题,如何获取customer的更多(导航)属性? Include应该放在Where之前还是Where之后?有关系吗?当 运行 SQL Profiler 时,它注意到查询没有区别。我只是想确定在某些情况下,Include here 的位置是否重要?

select distinct c.customerName
from dbo.customer customer
inner join dbo.Transactions transaction
    on transaction.customerid = customer.customerid
inner join dbo.Purchases purchases
    on purchases.PurchaseId = transaction.PurchaseId
inner join dbo.Product product 
    on transaction.ProductId = product.ProductId
where tra.BKProduct = @ProductInput

原解:

var customerData = db.Customer
                      .Where(p => p.Transactions.SelectMany(c => c.Purchases).Select(gc => gc.Product.Where(gc => gc.BKProduct == ProductInput).Any());

另一个问题出现了,我们需要获取 Customer 的更多(导航)属性。

选项 1:

var customerData = db.Customer
                      .Include(c=>c.CustomerType)
                      .Include(c=>c.CustomerAddress)
                      .Where(p => p.Transactions.SelectMany(c => c.Purchases).Select(gc => gc.Product.Where(gc => gc.BKProduct == ProductInput).Any());

选项2:

var customerData = db.Customer
                      .Where(p => p.Transactions.SelectMany(c => c.Purchases).Select(gc => gc.Product.Where(gc => gc.BKProduct == ProductInput).Any())
                      .Include(c=>c.CustomerType)
                      .Include(c=>c.CustomerAddress)

在这种特定情况下,这可能无关紧要。

因为 c#“Include”是关于 SELECT 和生成的 sql 的 JOIN。

但是,您不想将“没关系”用作一揽子声明。

请参阅下面的答案(以及总体问题和其他答案)。

Does the order of LINQ functions matter?

当您开始输入诸如 Where 和 OrderBy 之类的东西时,操作顺序可能很重要。

始终查看生成的 sql 并问自己“它看起来合理吗”? (你已经从你的问题中做到了 :) ..我主要为未来的读者提到这个)

所以在这种特定情况下,这是一种偏好。我通常把 .Where 最后的。所以你的第一个例子符合我的个人喜好。

对于一些“进一步调查”,请查看类似的内容:https://weblogs.asp.net/dixin/introducing-linq-3-waht-is-functional-programming