![](/img/trans.png)
[英]Why EF Core automatically load related entities when property referring to the entity is accessed in Select method of Linq?
[英]EF Core Select one Entity filtered by related entities
我有一个问题,我正在努力寻找答案。
我有3个具有类似关系的Entity类(简化):
class Article {
public int id
public string Name
public int ArticleStandard Id
public int CompanyId
public ArticleStandard ArticleStandardNavigation
public Company CompanyNavigation
}
class ArticleStandard {
public int id
public ICollection<Article> Articles
}
class Company {
public in id
public ICollection<Article> Articles
}
因此关系是:1个公司可以有很多文章,1条标准文章可以有很多文章。 它们都在DBContext中设置为DBSet。 给定的是ArticleStandard的ID。 现在,我希望通过article实体获取所有拥有此标准文章的公司。 我想“产生”的TSQL是:
select c.* from Company c
inner join Article a on c.ID = a.CompanyId
inner join ArticleStandard on a.ArticleStandard = arts.id
Where arts.Id = 1
这给出了我想要的结果。
我做了很多尝试,但我不想发布所有试验来解决该问题,这可能会使它仅与Include和ThenInclude一起使用。 但是我不想获得所有Articles和ArticleStandard。 如果仅选择公司,则忽略包括: https : //docs.microsoft.com/zh-cn/ef/core/querying/related-data#ignored-includes
var vtp = context.Company.Include(a => a.Article).ThenInclude(ars => ars.ArticleStandardNavigation).ToList();
在这里,我甚至还很难在包含的实体上使用where子句。 我在这里阅读了有关该问题的信息: 如何在WhereInclude中添加where子句
但是我无法使其真正发挥作用,尤其是仅检索公司而不是其他实体。
我知道我可以全力以赴,然后把公司撤出去。 那行得通。 但是我想减少发送的数据量,并保持查询为一体。
有什么提示吗? 我对EF Core还是缺乏经验,LinQ有时也让我感到困惑。
如果您需要更多信息或可以向我指出类似的问题(我发现了一些类似的案例,但无法正确使用它们),我将非常感谢。
感谢您的时间。
好吧,不用担心SQL和联接。 在EF(核心)定位LINQ查询中,您可以使用导航属性访问相关数据。 在查询的上下文中,实体表示数据库表记录和导航-联接和相关表记录。
对于参考导航属性,您使用简单的条件,例如:
Where(entity => entity.Reference.SomeProperty == someValue)
对于集合导航属性,通常具有所需条件的“ Any
”,例如:
Where(entity => entity.Collection.Any(related => related.SomeProperty == someValue))
换句话说, 我想要具有至少一个与此值相关的记录的记录 。
将上述规则应用于您的模型,等效查询将如下所示:
var query = db.Companies
.Where(c => c.Articles.Any(a => a.ArticleStandardNavigation.id == 1));
生成的SQL很可能与您手工编写的SQL不同(通常我们无法控制ORM的SQL生成),但结果应该是。
顺便说一句,无需将Navigation
附加到导航属性名称。 默认(更直观)的约定是使用类名,例如
public class Article
{
// ...
public ArticleStandard ArticleStandard { get; set; }
public Company Company { get; set; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.