2017-01-24 13 views
3

私はC#でエンティティにLINQで、グループをやろうとしていることで、グループを生成しませんでしたが、生成されたクエリは、それが唯一の生成中に選択のLINQ:グループ化は、SQL

のLINQでグループが含まれていませんでした:

IQueryable<EntityDataView> data = (from a in ctx.EntityDataViews 
                 select a); 

IQueryable<viewClass> groupedData = (from x in data 
                 group x by new 
                 { 
                  x.Id, 
                  x.Code, 
                  x.Name, 
                  x.Amuont, 

                 } into g 
                 orderby g.Key.Amuont descending 
                 select new viewClass() 
                 { 
                  Id = g.Key.Id, 
                  Code = g.Key.Code, 
                  Name = g.Key.Name, 
                  Amuont = g.Key.Amuont, 
                 }); 

SQL:それは必要がないため

SELECT 
[Project1].[Code] AS [Code], 
[Project1].[Name] AS [Name], 
[Project1].[Id] AS [Id], 
[Project1].[Amuont] AS [Amuont] 
FROM (SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Code] AS [Code], 
    [Extent1].[Amuont] AS [Amuont], 
    [Extent1].[Name] AS [Name], 
    FROM [dbo].[EntityDataView] AS [Extent1] 
) AS [Project1] 
ORDER BY [Project1].[Amuont] DESC 
+0

あなたは私達にあなたのモデルを示してもらえますか? – galister

答えて

5

それは、GROUP BYを作成していません。 group intoを使用していて、グループを反復しておらず、値を集計していません。 Idが一意の列である場合、グループごとに1つのアイテムしか存在しないので、グループを作成していません。これは基本的に単純な選択と同じです。

EFは、LINQクエリの独自の評価に基づいてSQLクエリを作成することを承諾する必要があります。これらのクエリは異なる場合があります。あなたが持っている唯一の保証は、彼らが同じ結果を生み出すことです。

+1

ニースの答え(特に 'Id'パーツ!EFが実際にメタデータに基づいて、不要な演算子を除去するのに十分スマートです。それは集約関数についてだった –

+0

うん、私は(カウントを追加するのを忘れ)SQLであなたの助け –

+0

おかげで' (DISTINCTは禁止されているので、 'GROUP BY'を使用する必要があるインデックス付きビューでは)同じ実行計画を得ます.LINQでは、GROUP BY'は' DISTINCT'よりも遅い必要はありません。それは決して実行されないので、それは問題ではありません。 –

0

各グループの要素を繰り返し処理しないため、グループがありません。

IQueryableについての素晴らしい点は、クエリを最適化するのは非常に賢明だということです。まず、あなたのクエリに要素を追加し、後でそれを取り除く、あなたはSQLでそれを見ることはできません場合は、次の

var myItems = items.Select(item => new 
{ 
    X = item.A, 
    Y = item.B, 
    Z = item.C, 
}) 
.Select(item => new 
{ 
    X = item.A, 
    Z = item.C, 
}); 

あなたがたIQueryableはスマートで、あなたのSQLクエリでBの選択は表示されませんあなたがそれを望んでいないのを見るのに十分なほどです。

ところで、{Id、Code、Name、Amount}のすべての一意の値が必要なようです。このため、GroupByよりもEnumerable.Distinctを使用するほうが高速です。

+1

ため – Sefe

0

私はあなたのグループから最も多くの金額の行を持っていきたいと思います。 これを試してください。

IQueryable<viewClass> groupedData = (from x in data 
        group x by new 
        { 
         x.Code, 
         x.Name 

        } into g 
        select new viewClass() 
        { 
         Id = gp.OrderByDescending(x => x.Amuont).FirstOrDefault().Id, 
         Code = g.Key.Code, 
         Name = g.Key.Name, 
         Amuont = g.Max(_=>_.Amuont) 
        }); 
関連する問題