c# – 使用多对多关系实体框架强制内部联接
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 使用多对多关系实体框架强制内部联接,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2361字,纯文字阅读大概需要4分钟。
内容图文
我在我的数据库中设置了多对多关系,如下所示:
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表中,并且能够在User.Last上执行某个操作而不是执行子查询.有没有办法强迫这种行为?难道我做错了什么?
谢谢.
UPDATE
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'
解决方法:
看起来这是EF目前没有做的优化.就个人而言,除非性能成为问题,否则我会坚持使用它生成的子查询.
但是,如果您愿意丢失用户和技能的直接导航属性,则可以对中间表进行建模以获取您要查找的查询.
public class User
{
public int Id { get; set; }
public string First { get; set; }
public string Last { get; set; }
public virtual ICollection<UserSkill> UserSkills { get; set; }
}
public class UserSkill
{
public int Id { get; set; }
[Required]
public User User { get; set; }
[Required]
public Skill Skill { get; set; }
}
public class Skill
{
public int Id { get; set; }
public string Description { get; set; }
public virtual ICollection<UserSkill> UserSkills { get; set; }
}
然后,以下查询将生成连接而不是子查询
from x in db.UserSkills
where x.Skill.Id == 5 && x.User.Last == "test"
select new {x.User.Id, x.Skill.Description};
内容总结
以上是互联网集市为您收集整理的c# – 使用多对多关系实体框架强制内部联接全部内容,希望文章能够帮你解决c# – 使用多对多关系实体框架强制内部联接所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。