Объединение 2 LINQ в один звонок - PullRequest
2 голосов
/ 19 октября 2010

Я использую 2 похожих запроса LINQ для возврата результата, единственное отличие - это предложение where (&& s.OptIn == "Yes").Есть ли способ выполнить это только с одним запросом?

Вместо результата

A   2 
B   3

и другого результата

A 1
B 1

Я хочу получить

A   2   1 
B   3   1

Вот ссылка:

        var result = from s in pdc.ScanLogs
                     from e in pdc.Exhibits
                     from ce in pdc.ClientEvents
                     where s.ExhibitID == e.ExhibitID
                     && e.ClientEventID == ce.ClientEventID
                     group 1 by new { ce.EventID } into d
                     select new {
                         EventID = d.Key.EventID,
                         Count = d.Count()
                     };

        var result = from s in pdc.ScanLogs
                     from e in pdc.Exhibits
                     from ce in pdc.ClientEvents
                     where s.ExhibitID == e.ExhibitID
                     && e.ClientEventID == ce.ClientEventID
                     && s.OptIn == "Yes"
                     group 1 by new { ce.EventID } into d
                     select new {
                         EventID = d.Key.EventID,
                         Count = d.Count()
                     };

Ответы [ 2 ]

1 голос
/ 19 октября 2010
IQueryable<ScanLog> scanlogs = pdc.ScanLogs;
if (filter) scanlogs = scanlogs.Where(...);
var result = from s in scanlogs
   ...
1 голос
/ 19 октября 2010

Вы можете указать предикат в методе Count. Пример ниже:

List<int> list = new List<int> { 1, 2, 3, 4, 5 };
var counts = new { CountAll = list.Count(), CountEven = list.Count(i => i % 2 == 0) };
Console.WriteLine(counts.CountEven);

Аналогичный запрос, написанный для Linq-To-Entities, также работал и создавал рабочий SQL.

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

var result = from s in pdc.ScanLogs
                from e in pdc.Exhibits
                from ce in pdc.ClientEvents
                where s.ExhibitID == e.ExhibitID
                && e.ClientEventID == ce.ClientEventID
                group new { s, e, ce } by new { ce.EventID } into d
                select new
                {
                    EventID = d.Key.EventID,
                    Count = d.Count(),
                    CountOptIn = d.Count(item => item.s.OptIn == "Yes")
                }; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...