web-dev-qa-db-ja.com

SQLからエンティティフレームワークまでのカウントグループ

このSQLステートメントをLinq-Entityクエリに変換する必要があります...

SELECT name, count(name) FROM people
GROUP by name
70
fefwfefefwfwe

クエリ構文

var query = from p in context.People
            group p by p.name into g
            select new
            {
              name = g.Key,
              count = g.Count()
            };

メソッド構文

var query = context.People
                   .GroupBy(p => p.name)
                   .Select(g => new { name = g.Key, count = g.Count() });
151
Aducci

編集:EF Core 2.1は最終的に GroupBy をサポートします

ただし、コンソール/ログで常にメッセージを確認してください。クエリをSQLに変換できず、ローカルで評価されるという通知が表示された場合は、書き換える必要がある場合があります。


Entity Framework 7(現在はEntity Framework Core 1.0/2.0に名前が変更されています)生成されたSQLのGROUP BYへの変換のためのGroupBy()はまだサポートしていません(1.0の最終リリースでもサポートしていません)。グループ化ロジックはクライアント側で実行されるため、大量のデータがロードされる可能性があります。

最終的にこのように記述されたコードは自動的にGROUP BYの使用を開始しますが、今のところ、グループ化されていないデータセット全体をメモリにロードするとパフォーマンスの問題が発生する場合、非常に注意する必要があります。

これが契約を破るシナリオの場合は、SQLを手動で記述し、EFを介して実行する必要があります。

疑わしい場合は、SQLプロファイラを起動して、生成されたものを確認します。これはおそらくとにかくすべきです。

https://blogs.msdn.Microsoft.com/dotnet/2016/05/16/announcing-entity-framework-core-rc2

20
Simon_Weaver

便利な拡張機能は、結果をDictionaryに収集して、高速検索(ループなど)を行うことです:

var resultDict = _dbContext.Projects
    .Where(p => p.Status == ProjectStatus.Active)
    .GroupBy(f => f.Country)
    .Select(g => new { country = g.Key, count = g.Count() })
    .ToDictionary(k => k.country, i => i.count);

もともとはここにあります: http://www.snippetsource.net/Snippet/140/groupby-and-count-with-ef-in-c

11
Christian Moser

eF 6.2では、私にとってはうまくいきました。

  var query = context.People
               .GroupBy(p => new {p.name})
               .Select(g => new { name = g.Key.name, count = g.Count() });
0
Nava Bogatee

これは.netコア2.1のグループ化の簡単な例です

var query = this.DbContext.Notifications.
            Where(n=> n.Sent == false).
            GroupBy(n => new { n.AppUserId })
            .Select(g => new { AppUserId = g.Key, Count =  g.Count() });

var query2 = from n in this.DbContext.Notifications
            where n.Sent == false
            group n by n.AppUserId into g
            select new { id = g.Key,  Count = g.Count()};

次のように変換されます:

SELECT [n].[AppUserId], COUNT(*) AS [Count]
FROM [Notifications] AS [n]
WHERE [n].[Sent] = 0
GROUP BY [n].[AppUserId]
0
Greg Gum