Подтвердить что ты не робот

Как получить максимальное значение столбца с помощью 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.?
4b9b3361

Ответ 1

Попробуйте int maxAge = context.Persons.Max(p => p.Age);

И убедитесь, что у вас есть using System.Linq; в верхней части файла

Ответ 2

Если список пуст, я получаю исключение. Это решение будет учитывать эту проблему:

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

Ответ 3

Или вы можете попробовать следующее:

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

Ответ 4

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

или что-то в этом роде.

Ответ 5

Может быть, помощь, если вы хотите добавить некоторый фильтр:

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

Ответ 6

В VB.Net это будет

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

Ответ 7

Как многие говорили - это версия

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

Ответ 8

Выбранный ответ вызывает исключения, а в ответе Карлоса Толедо применяется фильтрация после извлечения всех значений из базы данных.

Следующий запускает один цикл и читает одно значение, используя любые возможные индексы без исключения.

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

Ответ 9

Ваша колонка обнуляется

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

Ваш столбец не обнуляется

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]