Отображение классов Linq-SQL в классы домена с вложенными коллекциями - PullRequest
2 голосов
/ 16 марта 2012

У меня есть следующие функции сопоставления:

 private static Expression<Func<ActionComment, Domain.ActionComment>> MapActionComment =
      actionComment => new Domain.ActionComment
      {
        Id = actionComment.Id,
        Comment = actionComment.Comment,
      };

    private static Expression<Func<Action, Domain.Action>> MapAction =
      action => new Domain.Domain
      {
        Id = action.Id,
        Comments = action.ActionComments
                         .Select(ac => MapActionComment.Invoke(ac))
      };

    private static Expression<Func<Nc, Domain.Nc>> MapNc =
      nc => new Domain.Nc
              {
                Id = nc.Id,
                Actions = nc.Actions
                            .Select(a => MapAction.Invoke(a)),
              };

И следующий запрос Linq-to-SQL:

_ctx.NCs
  .Where(n => n.Id == id)
  .Select(MapNc)
  .SingleOrDefault();

В результате SQL-оператор будет выглядеть так:

Дело в том, что коллекция Comments объекта Action не загружает свое содержимое (оно отложено до фактического использования коллекции).

Есть ли способ заставить Linq-to-SQL генерировать ONE один оператор, который будет извлекать Ncs, Actions и ActionComments?

1 Ответ

0 голосов
/ 16 марта 2012

Вы должны посмотреть на нетерпеливую загрузку через Linq2Sql. Например, посмотрите этот блог: http://www.lowendahl.net/showShout.aspx?id=190

Кажется, есть некоторые проблемы, но они должны работать в grenal.

На самом деле, если это возможно, я бы предложил перейти к EntityFramework. В настоящее время LINQ2SQL является устаревшей технологией. В частности, EF имеет хорошую поддержку для активной загрузки, используя простой метод Include(), подобный следующему:

_ctx.NCs
   .Where(n => n.Id == id)
   .Select(MapNc)
   .Include(nc => nc.Comments)   //EF to eager load relation
   .Include(nc => nc.Actions)   //EF to eager load relation
   .SingleOrDefault();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...