EF Core 查询多个表,条件介于

Kis*_*ány 4 entity-framework entity-framework-core asp.net-core-webapi

我有 2 个具有以下结构的表:

用户

UserId   |   Age
----------------
     1       15
     2       36
     3       25
Run Code Online (Sandbox Code Playgroud)

字典时代

Title   |   FromAge   |   ToAge
-------------------------------
     1        0             20
     2        20            35
     3        35            100
Run Code Online (Sandbox Code Playgroud)

我为 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
Run Code Online (Sandbox Code Playgroud)

请注意,我没有向任何这些模型添加任何导航属性(我应该添加任何吗??)

如何将这样的查询转换为实体框架核心查询?

Sam*_*ath 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 };
Run Code Online (Sandbox Code Playgroud)

基于方法:

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});
Run Code Online (Sandbox Code Playgroud)

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

更新 :

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