LINQ to SQL - получить все записи из обеих коллекций - PullRequest
0 голосов
/ 02 марта 2011

У меня есть анонимная коллекция LINQ, которая называется ProgramRevisions:

RevisionID     RevisionName
1              Government
2              Business
3              Public Sector

У меня также есть анонимная коллекция под названием Расходы

ExpDisplay     ExpSort      ExpProgramRevID
N/A            0001         1
Water/Sewer    0002         1
Trash/Bulk     0004         1
Debt Service   0003         2
Loan Collect   0005         2

Мне нужно получить этот набор результатов:

ExpDisplay    ExpSort       ExpProgramRevID     ProgramRevName
N/A            0001         1                   Government
Water/Sewer    0002         1                   Government
Trash/Bulk     0004         1                   Government
Debt Service   0003         2                   Business
Loan Collect   0005         2                   Business
NULL           NULL         3                   Public Sector

Другими словами, мне нужны все строки, совпадающие по ProgramRevID, И мне нужна запись для каждого ProgramRevision, независимо от того, имеет ли он соответствующую строку в Расходах.

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

1 Ответ

3 голосов
/ 02 марта 2011

Будет возвращен точный ожидаемый результат (пересмотренные расходы на левое соединение):

var revisions = new List<Revision>();
revisions.Add(new Revision { Id = 1, Name = "Government" });
revisions.Add(new Revision { Id = 2, Name = "Business" });
revisions.Add(new Revision { Id = 3, Name = "Public Sector" });

var expenditures = new List<Expenditure>();
expenditures.Add(new Expenditure { Display = "N/A", ExpSort = "0001", RevisionId = 1 });
expenditures.Add(new Expenditure { Display = "Water/Sewer", ExpSort = "0002", RevisionId = 1 });
expenditures.Add(new Expenditure { Display = "Trash/Bulk", ExpSort = "0003", RevisionId = 1 });
expenditures.Add(new Expenditure { Display = "Debt Service", ExpSort = "0004", RevisionId = 2 });
expenditures.Add(new Expenditure { Display = "Loan Collect", ExpSort = "0005", RevisionId = 2 });

var result = revisions
    .GroupJoin(expenditures,
        r => r.Id,
        e => e.RevisionId,
        (r, e) => new { Revision = r, Expenditures = e.DefaultIfEmpty() }
    ).SelectMany(x => 
          x.Expenditures.Select(e => new { Revision = x.Revision, Expenditure = e })
    ).Select(x => new
    {
        Display = (x.Expenditure == null ? null : x.Expenditure.Display),
        ExpSort = (x.Expenditure == null ? null : x.Expenditure.ExpSort),
        RevisionId = x.Revision.Id,
        RevisionName = x.Revision.Name
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...