【问题标题】:How to create many to many relationship in Linq to SQL?如何在 Linq to SQL 中创建多对多关系?
【发布时间】:2010-02-26 19:12:07
【问题描述】:

我有一个用户表、角色表和一个链接表 User2Roles。我想创建 LinqToSQL 实体,以便我可以手动访问用户作为 role.Users 和 user.Roles 的角色。使用设计器,它实际上创建了 3 个实体,User to User2Roles 和 User2Roles to Roles。

【问题讨论】:

  • 您知道,要么接受答案,要么在答案不符合您的预期时给予进一步澄清,这通常是一个好政策。

标签: linq-to-sql


【解决方案1】:

您可以在角色和用户类中创建自己的属性。此属性的目的是获取当前角色的用户并将结果作为集合返回。然后你可以对其他类做同样的事情。

这是一些未经测试的代码(一旦我可以回到我的开发箱将被替换)

partial class Roles
{
  List<users> Users
  {
    get { return User2Roles.users.toList(); }
  }
}

partial class Users
{
  List<roles> Roles
  {
    get { return User2Roles.roles.toList(); }
  }
}

【讨论】:

    【解决方案2】:

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

    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); }
        }
    }
    

    这就是它的全部内容。这将为您省去总是必须处理中间实体的麻烦。您可以针对它编写代码,就好像它是真正的 M:M 关系:

    foreach (Role role in user.Roles) { ... }
    

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

    【讨论】:

    • 为什么选择 IEnumerable?我会让属性返回 IQueryable 以延迟执行...?
    • @Eric:好点。我认为 Linq to SQL 会认识到 IEnumerable 也实现了 IQueryable,但最好让它明确。
    • 我越想越觉得你是对的。我想 IEnumerable 可能也一样好,因为在您实际将枚举数移动到真实值并尝试读取它之前,查询不会执行。
    【解决方案3】:

    不幸的是,我相信你被那个临时实体困住了。据我所知,Linq to SQL 并不像您想的那样以一种非常干净的方式支持多对多连接。代码中有一些变通方法可以使对象模型至少看起来以您想要的方式支持多对多。

    Check out this post on SO
    或者这个link

    【讨论】:

      猜你喜欢
      • 2012-10-07
      • 2023-04-05
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 2020-10-14
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多