LINQ to SQL:循环查询

时间:2010-11-09 01:15:40

标签: linq-to-sql

我有一个User类,它有很多帖子,post类有一个用户属性。我的问题是,在获取用户的存储库中,我调用Post存储库来获取所有用户帖子。在获取Post的存储库中,我还调用User存储库来获取海报。如何使用POCO和存储库模式处理这样的事情?

这是模型。

public class User {
    public IEnumerable<Post> Posts {get; set;}
    /* Other properties here */
}

public class Post {
    public User Poster {get; set;}
    /* Other properties here */
}

存储库代码:

public IQueryable<User> GetUsers()
{
        return from u in context.Users
               select new User
                          {
                              /*Other properties */
                              Posts = postRepo.GetPostsByUserId(u.UserId)
                          };
}

public IQueryable<Post> GetPostsByUserId(int userId)
{
     //Well, I actually call GetPosts().Where(p => p.PosterId == userId);
     return from p in context.Posts
            select new Post
                      {
                          /*Other properties */
                          Poster = userRepo.GetUsers().Where(u => u.UserId == p.PosterId).SingleOrDefault()
                      };
}

如果我打电话给任何一个,我会收到错误Object not instantiated

PS。我刚刚删除了针对错误问题的问题,因此我提出了一个正确定义问题的新问题。

2 个答案:

答案 0 :(得分:0)

你做错了;)并忽略了Linq to Sqls为相关实体正确生成连接的能力:

http://msdn.microsoft.com/en-us/library/bb399393.aspx

http://msdn.microsoft.com/en-us/library/system.data.linq.dataloadoptions.loadwith.aspx


EF示例:

var postsWithUsers = from p in context.Posts.Include("Users")
                     select new Post

良好的文档: http://msdn.microsoft.com/en-us/library/bb896272.aspx

答案 1 :(得分:0)

您想在DataContext的存储库模式之上实现自己的存储库模式吗?您希望您的存储库能够毫不费力地在数据库类型和域类型之间进行转换吗?

通过返回延迟查询,您似乎无法控制何时发生数据库访问。

由于查询被推迟,您的上下文会暂停一段时间,所以您可能不会在工作单元之后处理它。你正在为陈旧的数据做好准备。

public Domain.User GetUserWithPostsById(int userId)
{
DataLoadOptions myOptions = new DataLoadOptions();
myOptions.LoadWith<User>(u => u.Posts);

User record = null;

using (MyDataContext myDC = new MyDataContext(connString))
{
  myDC.LoadOptions = myOptions;
  record = myDC.Users.Single(u => u.UserId = userId);
}

Domain.User result = TranslateUserWithPostsToDomain(record);
return result;
}