[c#] 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.?



답변

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

그리고 using System.Linq;파일 상단에


답변

목록이 비어 있으면 예외가 발생합니다. 이 솔루션은 다음 문제를 고려합니다.

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


답변

또는 이것을 시도 할 수 있습니다.

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


답변

필터를 추가하려면 도움이 될 수 있습니다.

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


답변

maxAge = Persons.Max(c => c.age)

또는 그 라인을 따라 뭔가.


답변

열은 nullable입니다.

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

열이 null이 아닙니다.

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

두 경우 모두 두 번째 코드를 사용할 수 있습니다. 을 사용 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]


답변

많은 사람들이 말했듯이-이 버전

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()