LINQ to SQL: круговые запросы - PullRequest
1 голос
/ 09 ноября 2010

У меня есть класс User, который имеет много сообщений, а класс сообщений имеет свойство 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 голосов
/ 10 ноября 2010

Вы хотите реализовать свой собственный шаблон хранилища поверх шаблона хранилища, который является 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;
}
0 голосов
/ 09 ноября 2010

Вы делаете это неправильно;) и игнорируете способность 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...