筛选集合导航属性

Posted

技术标签:

【中文标题】筛选集合导航属性【英文标题】:Filtering on the Collection Navigation property 【发布时间】:2020-09-22 18:06:54 【问题描述】:

我想根据“Translations”集合导航属性过滤我的“TranslationSet”实体。

例如

如果“翻译”的“LanguageId”为 5(意大利语),则应从结果中删除包含此“翻译”的“翻译集”。

这是我的实体类:

public class Language

    public int LanguageId  get; set; 
    public string NationalLanguage  get; set; 

    //Make table multi tenanted.
    public int TenantId  get; set; 
    public ApplicationTenant Tenant  get; set; 

    public List<Translation> Translation  get; set;  = new List<Translation>();



public class Translation

    public int TranslationId  get; set; 
    public string TranslatedText  get; set; 

    public int LanguageId  get; set; 
    public Language Language  get; set; 

    //Make table multi tenanted.
    public int TenantId  get; set; 
    public ApplicationTenant Tenant  get; set; 


    public int TranslationSetId  get; set; 
    public TranslationSet TranslationSet get; set;



public class TranslationSet

    public int TranslationSetId  get; set; 
    public int TenantId  get; set; 
    public ApplicationTenant Tenant  get; set;  

    public IEnumerable<Translation> Translations  get; set; 


Here is my attempt

从图中您可以看到查询失败,因为存在 LanguageId 为 5 的 Translation。

我已经尝试了很多次尝试来解决这个问题,但我什至无法关闭正确返回我的查询的 LINQ。

如果需要进一步澄清,请告诉我,并提前感谢任何提供帮助的人。

【问题讨论】:

下次请将代码和结果添加为文本。 【参考方案1】:

我几乎总是有效的经验法则是:从查询您想要的实体开始。正如您在查询结果中看到的那样,这将防止重复。然后使用导航属性添加谓词来过滤实体。那将是:

var sets = TranslationSets // start the query here
    .Where(ts => ts.Translations.All(t => t.LanguageId != 5)); // Filter

或者如果你更喜欢这个:

var sets = TranslationSets // start the query here
    .Where(ts => !ts.Translations.Any(t => t.LanguageId == 5)); // Filter

EF 会将这两个查询翻译为WHERE NOT EXISTS

【讨论】:

您好@Gert Arnold,感谢您抽出时间帮助我并提供更多建议,非常感谢。

以上是关于筛选集合导航属性的主要内容,如果未能解决你的问题,请参考以下文章

C#的问题,怎么在List集合中筛选数据?

C#的问题,怎么在List集合中筛选数据?

C#的问题,怎么在List集合中筛选数据?

Ef core LazyLoading - 访问集合类型的嵌套导航属性引发 DetachedLazyLoadingWarning 错误

Ef核心LazyLoading - 类型集合的访问嵌套导航属性抛出DetachedLazyLoadingWarning错误

使用迭代器做自定义筛选