【发布时间】:2014-04-18 18:42:58
【问题描述】:
我的数据库中有一个多对多关系设置,如下所示:
User
-------
Id (PK, Identity)
First
Last
...various other fields
Skill
-------
Id (PK, Identity)
Description
UserSkill
-----------
UserId (PK, FK on User.Id)
SkillId (PK, FK On Skill.Id)
当我在 DbContext 上运行此 LINQ 查询时:
from u in Users
from s in u.Skills
where s.Id == 5
select new
{
u.Id,
s.Description
})
生成的 SQL 包含我想要的所有内部连接:
SELECT
[Extent1].[UserId] AS [UserId],
[Extent2].[Description] AS [Description]
FROM [dbo].[UserSkill] AS [Extent1]
INNER JOIN [dbo].[Skill] AS [Extent2] ON [Extent1].[SkillId] = [Extent2].[Id]
WHERE 5 = [Extent2].[Id]
但是,当我添加一个简单的额外 where 子句时:
from u in Users
from s in u.Skills
where s.Id == 5
&& u.Last == "test"
select new
{
u.Id,
s.Description
})
现在生成的 SQL 使用了子查询:
[Extent1].[Id] AS [Id],
[Filter1].[Description] AS [Description]
FROM [dbo].[User] AS [Extent1]
INNER JOIN (SELECT [Extent2].[UserId] AS [UserId], [Extent3].[Description] AS [Description]
FROM [dbo].[UserSkill] AS [Extent2]
INNER JOIN [dbo].[Skill] AS [Extent3] ON [Extent3].[Id] = [Extent2].[SkillId]
WHERE 5 = [Extent3].[Id] ) AS [Filter1] ON [Extent1].[Id] = [Filter1].[UserId]
WHERE 'test' = [Extent1].[Last]
也许我遗漏了一些东西,但我认为 EF 只会将另一个联接添加回 User 表以进行此查询,并且能够在 User.Last 上执行 where 而不是执行子查询。有没有办法强制这种行为?难道我做错了什么?
谢谢。
更新
Cosmin,我希望查询结果如下:
SELECT u.Id, s.Description
FROM [User] u INNER JOIN
[UserSkill] us ON u.Id = us.UserId INNER JOIN
[Skill] s ON us.SkillId = s.Id
WHERE s.Id = 2 AND u.Last = 'test'
【问题讨论】:
-
您是否希望您的查询类似于:SELECT * FROM (SELECT * from Users where ...) Usr inner join Skill where ...?
-
内森,我看不出什么是重复的?据我所知,该连接看起来不像多对多。你能解释一下吗?
-
我这里没有 VS:但在我看来,我们可以尝试这样的事情:dbcontext.users.where(x => x.id == 5).include("skills" )
-
@Nathan 不是重复的,因为在多对多中,实体模型中没有任何东西可以加入
标签: c# linq linq-to-entities entity-framework-5 linq-query-syntax