49761


あるテーブルの各カラムの最大値を1つのクエリで取り出したいです。  
SQLで書けば、下記のようになると思います。

[code]

    select max(column1),max(column2),max(column3) from table1;
    
[/code]

これをLINQを使って下記のように実現しましたが、例1では複数のクエリが発行されてしまいますし、例2では「GroupBy句でIDに0を掛けて1つのグループにする」ことで疑似的に実現しているため、うまくないように思えます。  
LINQで無理やりではない（より良い）実現方法を教えていただけるでしょうか？

例1.

[code]

    var column1 = db.table1.Max(a => a.column1);
    var column2 = db.table1.Max(a => a.column2);
    var column3 = db.table1.Max(a => a.column3);
    
[/code]

例2.

[code]

    db.table1.GroupBy(a => a.Id * 0).Select(a => new {
      column1 = a.Max(b => b.column1),
      column2 = a.Max(b => b.column2),
      column3 = a.Max(b => b.column3),
    }).FirstOrDefault();
    
[/code]

フレームワーク：.Net Framework 4.6.1、Entity Framework 6.0


CC BY-SA 4.0
2018-10-29T02:20:48.317
49744
2018-10-29T13:27:18.387
2018-10-29T06:23:41.017
30742
30742
question
c# linq
LINQ to Entitiesで「各カラムの最大値」を求める良い方法を教えてください


> select max(column1),max(column2),max(column3) from table1;

これは全てのRDBで使える構文じゃないので、Entity Framework では難しいのじゃないでしょうか？  
Entity Framework はそもそも遅いので妥協が必要です。  
記載のやり方は最適解かはともかく、適解ではあると思います。  
ただ、GroupBy(a => a.Id * 0) は GroupBy(a => 0) のほうが単一グループだと解り易いのでは？


CC BY-SA 4.0
2018-10-29T08:26:41.503
49761
2018-10-29T08:26:41.503
18616
49744
answer


>
[code]

>     select max(column1),max(column2),max(column3) from table1;
>  
[/code]

はSQL標準に従っているので大抵のRDBで使えると思うのですが…。

それはそうと、Entity FrameworkではLinq to Entitiesがよく取り上げられますが、それだけではなく[Entity
SQL](https://docs.microsoft.com/en-
us/dotnet/framework/data/adonet/ef/language-reference/entity-sql-
language)と呼ばれるSQL標準とは異なる独自のSQL言語を持っています。基本的にEntity SQLは基本的にはSQL標準に近いため

[code]

     select max(column1),max(column2),max(column3) from table1;
    
[/code]

はそのまま実行できるはずです。実行するためには[`ObjectContext.CreateQuery()`](https://docs.microsoft.com/ja-
jp/dotnet/api/system.data.objects.objectcontext.createquery?view=netframework-4.7.2)メソッドを使います。

* * *

>
[code]

>     db.table1.GroupBy(a => a.Id * 0).Select(a => new {
>       column1 = a.Max(b => b.column1),
>       column2 = a.Max(b => b.column2),
>       column3 = a.Max(b => b.column3),
>     }).FirstOrDefault();
>  
[/code]

はもう少し簡潔に書けます。`GroupBy()`メソッドにはいくつかオーバーロードがあり、

[code]

    db.table1.GroupBy(a => 0, (_, a) => new {
      column1 = a.Max(b => b.column1),
      column2 = a.Max(b => b.column2),
      column3 = a.Max(b => b.column3),
    }).FirstOrDefault();
    
[/code]

とかできるかもしれません。

（どちらも試していませんので、間違っているかもしれません…。あしからず）


CC BY-SA 4.0
2018-10-29T13:27:18.387
49768
2018-10-29T13:27:18.387
4236
49744
answer