繁体   English   中英

EF Core选择一个由相关实体过滤的实体

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM