过滤“集合导航”属性

问题描述

我想基于“ TranslationSet”实体的“ Translations”集合导航属性对其进行过滤。

例如

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

以下是我的实体类

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。

我已经尝试了许多尝试来解决此问题,但是我什至无法关闭能够正确返回查询的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