Jak zrobiÄ ‡ zĹ ' Ä ... czenia w Linq przy uĹźyciu lambda i Drzewa wyrazăłw?

Próbuję wykonać JOIN w Linq używając wyrażeń lambda ... i napotkać pewne problemy.

Mam dwa byty, komentarze i komentarze. Komentarze źródła są powiązane z komentarzami. Mam następujący kod, który działa:

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));

Muszę dołączyć komentarze do Komentarzy w polu, a chciałbym użyć, jeśli to możliwe, coś w stylu:

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

Jak mogę to zrobić używając lambda w drzewie wyrażeń?

Jeszcze jedno ... jak Dodaję gdzie do oświadczenia Join?

Zamiast zadawać kolejne pytanie ... jak zrobić klauzulę Where na tym połączeniu? Na przykład, mam pole o nazwie SourceId na CommentSource, które chciałbym filtrować według.
Author: mattruma, 2008-12-06

2 answers

Musisz podać pięć rzeczy (co najmniej):

  • Sekwencja "zewnętrzna" (Komentarze) (Jest to pierwszy parametr)
  • Sekwencja "wewnętrzna "(CommentSource)
  • Jak dostać się z komentarza do klucza
  • Jak dostać się z komentarza do klucza
  • jaki ma być wynik dla pary komentarzy/komentarzy

Na przykład:

query = query.Join(ctx.DataContext.CommentSource,
                   comment => comment.CommentSourceId,
                   commentSource => commentSource.Id,
                   (comment, commentSource) 
                      => new { Comment=comment, CommentSource=commentSource });
 15
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-06 14:57:29

Oto mój ostatni kod:

            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));
 5
Author: mattruma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-06 15:31:02