如何基于关联表多值过滤LINQ查询获取Meta实体
解决方案
要获取符合要求的Meta实体(要么自身属于指定站点,要么关联的View属于指定站点),可以用以下两种LINQ实现方式:
方式1:用Any检查关联View
Metas = await siteExp.MetaEntriesAsync(m => m.SiteId == site.Id || (m.ViewId.HasValue && siteExp.Views.Any(v => v.Id == m.ViewId.Value && v.SiteId == site.Id)) );
- 保留了你原代码中
Meta.SiteId == site.Id的条件,若不需要可直接移除该部分。 m.ViewId.HasValue用于避免空值引发的查询错误。
方式2:显式Join关联查询
var query = from m in siteExp.Metas join v in siteExp.Views on m.ViewId equals v.Id into viewJoin from v in viewJoin.DefaultIfEmpty() where m.SiteId == site.Id || (v != null && v.SiteId == site.Id) select m; Metas = await query.ToListAsync();
- 这种方式完全匹配你给出的SQL语句逻辑,通过Join关联
Meta和View后筛选结果。
优化建议
如果给Meta实体添加View导航属性:
public class Meta : DbAssets, IMeta { // 原有属性... public virtual View View { get; set; } }
可以进一步简化查询:
Metas = await siteExp.MetaEntriesAsync(m => m.SiteId == site.Id || (m.View != null && m.View.SiteId == site.Id) );
内容的提问来源于stack exchange,提问作者SteinTech
相关产品推荐
相关产品推荐

