MVC - Linq - 使用另一个表中的记录填充列表<t> </t>

时间:2009-09-18 17:27:58

标签: 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; }

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

我还有一个名为AllowedForums的链接表,如下所示:

userid  forumid
  1       4

为了选择允许用户查看的论坛和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 to SQL?

AllowedForum应该是一个具有自己的表映射的值对象吗?这似乎有点矫枉过正,但我​​可以很容易地加入它。我简要地看了一下EntitySet,但我看到的简单例子似乎并不合适。感觉应该有一种优雅的方式来为每个用户获取Forum对象的集合,但我无法想出任何。顺便说一句,我是C#&amp; amp;的新手。 OO。我还应该提一下,由于这些是应用程序的早期阶段,如果有一种我没有看到的更好的方法,我愿意改变实体或表格的结构/关系。

2 个答案:

答案 0 :(得分:3)

您应该有另一个Entity类(可能应该是内部的),它反映了数据库中的AllowedForums表。现在我假设您的User表和您的Forums表都与此AllowedForums表具有PK / FK关系。因此,User类上应该有一个如下所示的内部属性:

internal EntitySet<AllowedForums> AllowedForumsRelationships
{
   get;set;
}

或类似的东西。这应该在User和Forums类上。您的AllowedForums类将有两个属性。一个用户,一个用于论坛。 (如果您使用LINQ to SQL设计器,所有这一切都将自动发生)。

如果你有这个,如果你想获得一个用户的所有AllowedForums,你可以这样做:

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

这是有效的,所以它应该适用于你正在谈论的场景。

答案 1 :(得分:0)

类似的东西:

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;