2つのLINQを1つの呼び出しに結合する

c# linq linq-to-sql
2つのLINQを1つの呼び出しに結合する

2つの同様のLINQクエリを使用して結果を返していますが、唯一の違いはwhere句( && s.OptIn ==" Yes ")です。 1つのクエリのみでこれを実行する方法はありますか?

結果の代わりに

A   2
B   3

そして別の結果

A 1
B 1

欲しい

A   2   1
B   3   1

LINQは次のとおりです。

        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  0


ベストアンサー

Countメソッドで述語を提供できます。 例を以下に示します。

List list = new List { 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")
                };

1


IQueryable scanlogs = pdc.ScanLogs;
if (filter) scanlogs = scanlogs.Where(...);
var result = from s in scanlogs
   ...

1


タイトルとURLをコピーしました