web-dev-qa-db-ja.com

Entity Frameworkを使用して列の最大値を取得する方法は?

整数を含む列の最大値を取得するには、次のT-SQLコマンドを使用できます

SELECT MAX(expression )
FROM tables
WHERE predicates;

Entity Frameworkで同じ結果を取得することは可能ですか?.

私は次のモデルを持っているとしましょう

public class Person
{
  public int PersonID { get; set; }
  public int Name { get; set; }
  public int Age { get; set; }
}

最年長者の年齢を取得するにはどうすればよいですか?

int maxAge = context.Persons.?
76
Richard77

これを試してくださいint maxAge = context.Persons.Max(p => p.Age);

そして、ファイルの先頭にusing System.Linq;があることを確認してください

128
krolik

リストが空の場合、例外が発生します。このソリューションでは、この問題を考慮します。

int maxAge = context.Persons.Select(p => p.Age).DefaultIfEmpty(0).Max();
36
Carlos Toledo

または、これを試すことができます:

(From p In context.Persons Select p Order By age Descending).FirstOrDefault
9
danicode

フィルターを追加したい場合、助けになるかもしれません:

context.Persons
.Where(c => c.state == myState)
.Select(c => c.age)
.DefaultIfEmpty(0)
.Max();
6
Foy
maxAge = Persons.Max(c => c.age)

またはそれらの線に沿って何か。

5
E.J. Brennan

VB.Netでは

Dim maxAge As Integer = context.Persons.Max(Function(p) p.Age)
2
dipi evil

多くの人が言ったように-このバージョン

int maxAge = context.Persons.Max(p => p.Age);

テーブルが空の場合に例外をスローします。

つかいます

int maxAge = context.Persons.Max(x => (int?)x.Age) ?? 0;

または

int maxAge = context.Persons.Select(x => x.Age).DefaultIfEmpty(0).Max()
1
A K

選択された回答は例外をスローし、Carlos Toledoからの回答は、データベースからすべての値を取得した後にフィルタリングを適用します。

次のコードは、単一のラウンドトリップを実行し、可能なインデックスを使用して例外なく単一の値を読み取ります。

int maxAge = _dbContext.Persons
  .OrderByDescending(p => p.Age)
  .Select(p => p.Age)
  .FirstOrDefault();
1
SuperDuck

あなたの列はnull可能です

int maxAge = context.Persons.Select(p => p.Age).Max() ?? 0;

列はnull入力不可

int maxAge = context.Persons.Select(p => p.Age).Cast<int?>().Max() ?? 0;

どちらの場合でも、2番目のコードを使用できます。 DefaultIfEmptyを使用すると、サーバーでより大きなクエリを実行できます。興味がある人のために、EF6に相当するものを次に示します。

DefaultIfEmptyなしのクエリ

SELECT 
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT 
        MAX([Extent1].[Age]) AS [A1]
        FROM [dbo].[Persons] AS [Extent1]
    )  AS [GroupBy1]

DefaultIfEmptyを使用したクエリ

SELECT 
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT 
        MAX([Join1].[A1]) AS [A1]
        FROM ( SELECT 
            CASE WHEN ([Project1].[C1] IS NULL) THEN 0 ELSE [Project1].[Age] END AS [A1]
            FROM   ( SELECT 1 AS X ) AS [SingleRowTable1]
            LEFT OUTER JOIN  (SELECT 
                [Extent1].[Age] AS [Age], 
                cast(1 as tinyint) AS [C1]
                FROM [dbo].[Persons] AS [Extent1]) AS [Project1] ON 1 = 1
        )  AS [Join1]
    )  AS [GroupBy1]
0
jsgoupil