C# MVC-Linq-使用另一个表中的记录填充列表

C# MVC-Linq-使用另一个表中的记录填充列表,c#,asp.net-mvc,linq,linq-to-sql,domain-driven-design,C#,Asp.net Mvc,Linq,Linq To Sql,Domain Driven Design,我正在原型化我的第一个MVC应用程序,它是一个简单的论坛。我已经完成了域模型的一部分,我正试图弄清楚如何在SQL中做一些非常基本的事情,但我无法在我的应用程序中弄清楚。以下是我的实体: [Table(Name="Users")] public class User { [Column(IsPrimaryKey=true, IsDbGenerated=true, AutoSync=AutoSync.OnInsert)] public int Id { get; set; }

我正在原型化我的第一个MVC应用程序,它是一个简单的论坛。我已经完成了域模型的一部分,我正试图弄清楚如何在SQL中做一些非常基本的事情,但我无法在我的应用程序中弄清楚。以下是我的实体:

[Table(Name="Users")]
public class User
{
    [Column(IsPrimaryKey=true, IsDbGenerated=true, AutoSync=AutoSync.OnInsert)]
    public int Id { get; set; }

    [Column] public string Username { get; set; }
    [Column] public string Password { get; set; }
    [Column] public string PasswordHash { get; set; }
    [Column] public string PasswordSalt { get; set; }
    [Column] public string FirstName { get; set; }
    [Column] public string LastName { get; set; }
    public List<Forum> AllowedForums { get; set; }
    [Column] public DateTime LastLogin { get; set; }
    [Column] public DateTime MemberSince { get; set; }
}

[Table(Name="Forums")]
public class Forum
{
    [Column(IsPrimaryKey=true, IsDbGenerated=true, AutoSync=AutoSync.OnInsert)]
    public int Id { get; set; }
    [Column] public int ParentId { get; set; }
    [Column] public string Title { get; set; }
    [Column] public string Description { get; set; }
    [Column] public bool IsGlobal { get; set; }
    [Column] public int DisplayOrder { get; set; }
}
为了选择允许用户查看的论坛和IsGlobal==true的论坛,我将在SQL中执行以下操作:

SELECT * FROM Forums
LEFT OUTER JOIN AllowedForums ON Forums.id = AllowedForums.Forumid
WHERE AllowedForums.Userid = 1
OR Forums.IsGlobal = 1
我应该如何填充

public List<Forum> AllowedForums
使用C/Linq到SQL的字段

AllowedForum应该是具有自己表映射的值对象吗?这似乎有些过分,但我可以很容易地加入其中。我简要地看了EntitySet,但我看到的简单示例似乎不适合。感觉应该有一种优雅的方式为每个用户收集论坛对象,但我想不出任何方法。顺便说一句,我是C&OO新手。我还应该提到,由于这些都是应用程序的早期阶段,如果没有更好的方法,我愿意更改实体或表的结构/关系。

类似于:

var AllowedForums = from f in ForumsTable
                    join af in AllowedForumsTable on f.Id equals af.forumid into temp
                    from aft in temp.DefaultIfEmpty()
                    where (f.IsGlobal == 1 || aft.userid == 1)
                    select f;

您应该有另一个实体类,该类可能应该是内部的,用于镜像数据库中的AllowedForums表。现在我假设你的用户表和论坛表都与这个AllowedForums表有PK/FK关系。因此,用户类上应该有一个如下所示的内部属性:

internal EntitySet<AllowedForums> AllowedForumsRelationships
{
   get;set;
}
    public IList<Forum> AllowedForums
    {
       get
       {
          var result = new List<Forum>();
          foreach(var relationShip in this.AllowedForumsRelationships)
          {
             result.Add(relationShip.Forum);
             return result;
          }
       }
    }
或者类似的。这应该是在用户和论坛类上。AllowedForums类将有两个属性。一个用于用户,一个用于论坛。如果您使用LINQtoSQL设计器,所有这些都会自动发生

一旦你做到了这一点,如果你想为一个用户获得所有允许的论坛,你可以这样做:

internal EntitySet<AllowedForums> AllowedForumsRelationships
{
   get;set;
}
    public IList<Forum> AllowedForums
    {
       get
       {
          var result = new List<Forum>();
          foreach(var relationShip in this.AllowedForumsRelationships)
          {
             result.Add(relationShip.Forum);
             return result;
          }
       }
    }
这是我刚写的一些粗略的代码,我不确定它是否100%准确,但我想你会明白的。基本上,你正在处理一个多对多的关系,这总是一种痛苦

编辑:我刚刚把Northwind数据库的这个想法和以下表格搞混了:

命令 订单详情 产品

这里存在多对多关系:一个订单可以有多个产品,一个产品可以属于多个订单。现在,假设您希望获得订单的所有产品:

public partial class Order
{
        public IList<Product> Products
        {
            get
            {
                var list = new List<Product>();
                foreach (var item in this.Order_Details)
                {
                    list.Add(item.Product);
                }
                return list;
            }
        }
 }

这是可行的,所以它应该也适用于您所讨论的场景。

foreach在第一次迭代期间是否会退出?类似于get{return from r in AllowerForumsRelationship select r.Forum;}我想我有足够的时间来尝试一下。我会让你知道事情的进展。我会得出结论,我在我的头上。我将使用拖放dbml方法。尝试你的第一个带有完整DDD/TDD的.net/OO/C/Linq/MVC项目,所有这些对我来说都太多了。必须在一个月内发货!所以,我确实认为你的答案是正确的,我已经给了你投票权。谢谢你的帮助。也许几个月后,我会重新进行重构,然后再试一次。