Linq to sql 如何在Linq到SQL中创建多对多关系?

Linq to sql 如何在Linq到SQL中创建多对多关系?,linq-to-sql,Linq To Sql,我有一个用户表、角色表和一个链接表User2Roles。我想创建LinqToSQL实体,这样我就可以从用户以role.Users和user.roles的身份手动访问角色。使用designer,它实际上创建了3个实体,用户到用户2角色和用户2角色到角色。不幸的是,我认为您只能使用临时实体。据我所知,LINQtoSQL并不像您所想的那样以一种干净的方式支持多对多连接。代码中有一些变通方法,可以使对象模型至少以您想要的方式支持多对多 或者,您可以在角色和用户类中创建自己的属性。此属性的目的是获取当

我有一个用户表、角色表和一个链接表User2Roles。我想创建LinqToSQL实体,这样我就可以从用户以role.Users和user.roles的身份手动访问角色。使用designer,它实际上创建了3个实体,用户到用户2角色和用户2角色到角色。

不幸的是,我认为您只能使用临时实体。据我所知,LINQtoSQL并不像您所想的那样以一种干净的方式支持多对多连接。代码中有一些变通方法,可以使对象模型至少以您想要的方式支持多对多



或者,您可以在角色和用户类中创建自己的属性。此属性的目的是获取当前角色的用户,并将结果作为集合返回。然后你可以对另一个类做同样的操作

以下是一些未经测试的代码(一旦我回到我的开发框,将被替换)

部分类角色
{
列出用户
{
获取{return User2Roles.users.toList();}
}
}
部分类用户
{
列出角色
{
获取{return User2Roles.roles.toList();}
}
}

您无法在Linq to SQL中实际创建多对多关系。但是,您可以轻松地为它创建自己的“糖”


您甚至应该能够在查询投影中使用它(尽管在过滤器中使用它可能会有一些问题)。

为什么是IEnumerable?我会让属性返回IQueryable以便延迟执行…?@Eric:说得好。我认为Linq to SQL会认识到,
IEnumerable
也实现了
IQueryable
,但最好是将其显式化。我越想它,我就越觉得你是对的。我认为IEnumerable可能也一样好,因为在您实际将枚举数移动到一个真值并尝试读取它之前,查询不会执行。您知道,通常最好接受答案,如果答案不是您所期望的,则给出进一步的澄清。
partial class Roles
{
  List<users> Users
  {
    get { return User2Roles.users.toList(); }
  }
}

partial class Users
{
  List<roles> Roles
  {
    get { return User2Roles.roles.toList(); }
  }
}
public partial class User
{
    public IQueryable<Role> Roles
    {
        get { return UserRoles.Select(ur => ur.Role); }
    }
}

public partial class Role
{
    public IQueryable<User> Users
    {
        get { return UserRoles.Select(ur => ur.User); }
    }
}
foreach (Role role in user.Roles) { ... }