C# MVC-Linq-使用另一个表中的记录填充列表
我正在原型化我的第一个MVC应用程序,它是一个简单的论坛。我已经完成了域模型的一部分,我正试图弄清楚如何在SQL中做一些非常基本的事情,但我无法在我的应用程序中弄清楚。以下是我的实体: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; }
[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项目,所有这些对我来说都太多了。必须在一个月内发货!所以,我确实认为你的答案是正确的,我已经给了你投票权。谢谢你的帮助。也许几个月后,我会重新进行重构,然后再试一次。