Как сделать Joins в Linq, используя лямбды и дерево выражений? - PullRequest
9 голосов
/ 06 декабря 2008

Я пытаюсь сделать JOIN в Linq, используя лямбда-выражения ... и сталкиваюсь с некоторыми проблемами.

У меня есть две сущности: Comments и CommentSources. CommentSources связаны с комментариями. У меня есть следующий код, который работает:

01 IQueryable<Data.Comment> query = ctx.DataContext.Comments;
02
03
04 if (criteria.IsDeleted == DeletedFilter.Deleted)
05    query = query.Where(row => row.DeletedBy != Guid.Empty);
06 else if (criteria.IsDeleted == DeletedFilter.NotDeleted)
07    query = query.Where(row => row.DeletedBy == Guid.Empty);
08
09 var data = query.Select(row => CommentInfo.FetchCommentInfo(row));

Мне нужно присоединиться к CommentSources для комментариев на поле, и я хотел бы использовать, если возможно, что-то вроде:

01 query = query.Join(join code goes here)

Как я могу сделать это, используя лямбды в дереве выражений?

Еще одна вещь ... как добавить оператор Where в оператор Join?

Вместо того, чтобы задавать другой вопрос ... как бы я сделал предложение Where для этого Join? Например, у меня есть поле SourceId в CommentSource, по которому я хотел бы отфильтровать.

Ответы [ 2 ]

15 голосов
/ 06 декабря 2008

Вам нужно указать пять вещей (как минимум):

  • «Внешняя» последовательность (Комментарии) (это неявный первый параметр)
  • «Внутренняя» последовательность (CommentSource)
  • Как перейти от источника комментариев к ключу
  • Как перейти от комментария к ключу
  • То, что вы хотите, чтобы результат был для пары CommentSource / Comment

Например:

query = query.Join(ctx.DataContext.CommentSource,
                   comment => comment.CommentSourceId,
                   commentSource => commentSource.Id,
                   (comment, commentSource) 
                      => new { Comment=comment, CommentSource=commentSource });
5 голосов
/ 06 декабря 2008

Вот мой окончательный код:

            var query = ctx.DataContext.Comments.Join(ctx.DataContext.CommentSources,
                  c => c.CommentId, 
                  s => s.CommentId,
                  (c, s) => new {Comment = c, CommentSource = s});

            if (criteria.SourceId != null && criteria.SourceId != Guid.Empty)
                query = query.Where(row => row.CommentSource.SourceId == criteria.SourceId);

            if (criteria.IsDeleted == DeletedFilter.Deleted)
                query = query.Where(row => row.Comment.DeletedBy != Guid.Empty);
            else if (criteria.IsDeleted == DeletedFilter.NotDeleted)
                query = query.Where(row => row.Comment.DeletedBy == Guid.Empty);

            var data = query.Select(row => CommentInfo.FetchCommentInfo(row.Comment));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...