.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
相关产品推荐
相关产品推荐

