我刚开始学习 LINQ2SQL,我想尝试的第一件事是简单的父子层次结构,但我似乎找不到一个好的方法。我在 SO 上看到了一些示例,我已经用谷歌搜索了,但我无法直接应用它们,所以我将准确解释我想要完成的工作。
让我们使用带有标签的常见示例。
数据库表:Post-- Post_Tags -- 标签
我创建了一个简单的 Post 类,因此我避免传递 Linq2Sql 类:
public class Post
{
public int Id {get; set;}
public int Title {get; set;}
public IEnumerable<string> Tags {get; set;}
}
我想从 Posts 表中选择 5 条最新记录,获取它们的相关标签并返回 IList,其中每个 Post 都填充了 Tags 属性。
你能给我看一个具体的 Linq2Sql 代码吗?
我试过了:
IList<Post> GetLatest()
{
return (from p in _db.Posts
orderby p.DateCreated descending
select new Post
{
Id = p.Id,
Title = p.Title,
Tags = p.Post_Tags.Select(pt => pt.Tag.Name)
}).Take(5).ToList();
}
这可行,但会复制每个 Tag 记录的 Post 记录,并且我必须在我使用的每个方法中复制属性映射 (Id=p.Id, ...)。然后我尝试了这种方法,但在这种情况下,我对每个标签都有一个到 DB 的往返:
IQueryable<Post> GetList()
{
return (from p in _db.Posts
select new Post
{
Id = p.Id,
Title = p.Title,
Tags = p.Post_Tags.Select(pt => pt.Tag.Name)
});
}
IList<Post> GetLatest()
{
return (from p in GetList()
orderby p.DateCreated descending
select p).Take(5).ToList();
}
如果我在经典 ADO.NET 中执行此操作,我将创建一个返回两个结果集的存储过程。一个带有 Post 记录,第二个带有相关的 Tag 记录。然后我会将它们映射到代码中(手动、DataRelation、ORM 等)。我可以对 LINQ2SQL 做同样的事情吗?
我真的很想看到一些关于你们如何处理如此简单的层次结构的代码示例。
是的,我真的很想返回 IList<> 对象和我的自定义类,而不是可查询的 Linq 到 Sql 对象,因为如果我决定放弃 Linq2Sql,我希望对数据访问代码保持灵活。
谢谢。