You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 2.0中如何基于关联模型数据查询目标模型数据?

解决EF Core 2.0 LINQ查询报错问题

我来帮你搞定这个问题!你遇到的InvalidOperationException是因为EF Core 2.0在处理关联数据过滤时,不支持你原来那种在属性表达式里嵌套子查询的写法,得换更贴合EF Core查询规则的方式来实现你要的SQL逻辑。

先明确你的需求:关联Movies和Reviews表,筛选出Movie.AuthorId = 1,同时对应的Review满足AuthorId = 3或SomeText包含definitely的所有匹配记录,和你给出的SQL逻辑完全一致。

下面给你两种正确的LINQ写法:

写法一:显式Join(和原生SQL结构最对应)

这种写法完全对应你写的SQL JOIN逻辑,可读性很高:

var queryResult = from movie in _context.Movies
                  join review in _context.Reviews on movie.ID equals review.FilmId
                  where movie.AuthorId == 1 && (review.AuthorId == 3 || review.SomeText.Contains("definitely"))
                  select new { Movie = movie, Review = review }; // 可以根据需要选择具体字段,比如select movie.Title, review.SomeText等

如果你的预期结果CCCC是某个特定字段,直接调整select部分即可,比如select movie.SomeField或者review.SomeField。

写法二:利用导航属性+SelectMany(更符合EF Core实体关联风格)

因为你已经配置了Movie和Review的关联(Movie应该有ICollection<Review> Reviews导航属性),可以用SelectMany展开关联的评论数据,再进行过滤:

var queryResult = _context.Movies
    .Where(m => m.AuthorId == 1)
    .SelectMany(m => m.Reviews, (movie, review) => new { movie, review })
    .Where(combined => combined.review.AuthorId == 3 || combined.review.SomeText.Contains("definitely"))
    .ToList();

为什么你的原写法报错?

你之前的LINQ应该是尝试在Where里对m.Reviews直接写子查询表达式,但EF Core要求Where中的表达式必须是直接的实体属性访问,不能是这种嵌套的子查询形式,所以才会抛出那个错误提示。上面两种写法都规避了这个问题,同时完美实现了你要的SQL逻辑。

内容的提问来源于stack exchange,提问作者user3257442

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:47:25