在 Collection 导航 属性 上过滤

Filtering on the Collection Navigation property

我想根据 'Translations' Collection 导航 属性.

过滤我的 'TranslationSet' 实体

例如

如果 'Translation' 的 'LanguageId' 为 5(意大利语),则 'TranslationSet' 包含此 'Translation'应该从结果中删除。

这是我的实体 类:

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 的翻译。

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

如果需要进一步说明,请告诉我,在此先感谢提供帮助的任何人。

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

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