EF Core查询多个表格并且满足条件

4
我有两个表,结构如下:
用户表
UserId   |   Age
----------------
     1       15
     2       36
     3       25

DictAges(字典时代)
Title   |   FromAge   |   ToAge
-------------------------------
     1        0             20
     2        20            35
     3        35            100

我为DbContext创建了必要的模型,称为UserModelDictAgesModel,其属性与表结构中显示的完全相同。我想通过id查询用户,并根据用户的年龄连接标题。以下是我之前使用的MySQL代码:
SELECT User.UserId, DictAges.Title 
FROM User, DictAges 
WHERE User.UserId = :id 
  AND User.Age BETWEEN DictAges.FromAge AND DictAges.ToAge

请注意,我没有将任何导航属性添加到这些模型中(我应该添加吗?)
如何将这样的查询转换为Entity Framework Core查询?
1个回答

6
因此,如果您没有导航属性,可以按照以下方式操作。
基于查询:
from p in ctx.User  
join q in ctx.DictAges on p.UserId equals q.Title
where p.UserId == :id AND p.Age BETWEEN q.FromAge AND q.ToAge
select new {UserId = p.UserId, Title = q.Title };

基于方法:

ctx.User.Join(ctx.DictAges, 
     p => p.UserId,
     q => q.Title, 
     (p, q) => new { User = p, DictAges = q })
.Where(s => s.User.UserId == :id && (s.DictAges.FromAge <= s.User.Age  && s.User.Age <=  s.DictAges.ToAge) )
.Select(ss => new { UserId = ss.User.UserId, Title = ss.DictAges.Title});

注意:由于您没有导航属性,基于方法的语法非常复杂。换句话说,可读性存在问题。因此,在这些情况下,我希望使用基于查询的语法。

更新:

您可以使用本文了解导航属性:关系


如果我不要求太多,你能否写一个lambda版本的它? - Kiss Koppány
看起来不错,我很快就会尝试。在那之前,你能否添加更多关于导航属性的信息,我的意思是哪个类应该拥有它,以及它如何影响查询本身?无论如何,谢谢你,如果给出的代码适用于我的解决方案,我仍然会接受你的答案。 - Kiss Koppány
1
我已经更新了帖子,请按照提到的文章进行。它详细解释了EF Core中导航属性的所有内容。 - Sampath
很奇怪这个被接受了,因为提供的两个查询都不能产生与原始SQL相同的结果(第一个甚至无法编译)。而导航属性不能用于创建范围相关性。 - Ivan Stoev
被接受的解决方案并不总是完全编译和工作的。但最重要的是解决方案向OP展示的方向。如果该方向是正确的,那么OP可以根据自己的应用进行调整。@IvanStoev - Sampath
我怀疑是因为没有一个方向是正确的 - 无论是join还是导航属性。事实上,它们是误导性的。真正的解决方案几乎与答案没有任何共同之处。 - Ivan Stoev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接