我想根据"Translations"集合导航属性筛选我的"TranslationSet"实体。
例如
如果"Translation"的"LanguageId"为5(意大利语(,则应从结果中删除包含此"Translation"的"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将两个查询都翻译为CCD_ 1。