2013-12-10 112 views
1

如何在LINQ中将以下SQL写入实体?我试图让所有用户访问使用论坛组分配的论坛。Linq to Entities Relationship加入

SELECT UsersInForumGroups.UserId FROM Forums 
JOIN ForumsInForumGroups on Forums.ForumId = ForumsInForumGroups.ForumId 
JOIN ForumGroups on ForumGroups.ForumGroupId = ForumsInForumGroups.ForumGroupId 
JOIN UsersInForumGroups on UsersInForumGroups.ForumGroupId = ForumGroups.ForumGroupId 
WHERE Forums.ForumId = 'blah' 

我有使用SQL外键设置的所有关系,它们在实体框架中工作,例如,这个语法正在工作。

db.ForumsInForumGroups.Select(x=>x.ForumGroup) 

如这里要求是实体设置

enter image description here

enter image description here

+0

我认为在LINQ实体你不需要创建一个连接查询,因为所有有关系的表都是自连接。所以只需要从父表获得值,孩子会很容易从他们身上获得。像'parenttablename.Childtable.fieldname' – Rahul

+0

你需要发布你的实体的样子。 –

回答

1

假设你有一个多到一个你tabels之间的关系,也可能是这样的:

var res = db.Forums.Include("ForumsInForumGroups.ForumGroups.UsersInForumGroups") 
      .Where(c => c.ForumId == "blah") 
      .Select(c => c.ForumsInForumGroups 
          .ForumGroups 
          .UsersInForumGroups 
          .UserId) 

编辑
没有必要为Include,那么你通过关系选择:

var res = db.Forums.Where(c => c.ForumId == "blah") 
      .Select(c => c.ForumsInForumGroups 
          .ForumGroups 
          .UsersInForumGroups 
          .UserId) 

编辑2
我是一个大胆的assumsion :)
试试这个:

var res = db.Forums.Where(c => c.ForumId == "blah") 
      .SelectMany(c => c.ForumsInForumGroups 
          .SelectMany(q => q.ForumGroups.UsersInForumGroups 
           .Select(z => z.UserId) 
            ) 
         ); 
+0

使用第二种解决方案我得到 错误'System.Data.Objects.DataClasses.EntityCollection '不包含'ForumGroups'的定义,也没有接受第一个参数类型的扩展方法'ForumGroups' 'System.Data.Objects.DataClasses.EntityCollection '可以找到(你是否缺少使用指令或程序集引用?) SQL服务器上的关系似乎都是正确的,即所有的一对一多少,没有很多manys。 E.g.一个ForumGroups可能有很多ForumsInForumGroups – Hoody

+0

@spangeman我更新了我的答案 –