筛选集合导航属性
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,感谢您抽出时间帮助我并提供更多建议,非常感谢。以上是关于筛选集合导航属性的主要内容,如果未能解决你的问题,请参考以下文章
Ef core LazyLoading - 访问集合类型的嵌套导航属性引发 DetachedLazyLoadingWarning 错误
Ef核心LazyLoading - 类型集合的访问嵌套导航属性抛出DetachedLazyLoadingWarning错误