问题描述
我想基于“ 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; }
}
从图像中您可以看到查询失败,因为存在翻译,其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
。