Как получить максимальное значение столбца, используя Entity Framework? - PullRequest
74 голосов
/ 25 сентября 2011

Чтобы получить максимальное значение столбца, который содержит целое число, я могу использовать следующую команду 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.?

Ответы [ 9 ]

124 голосов
/ 25 сентября 2011

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

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

35 голосов
/ 08 декабря 2016

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

int maxAge = context.Persons.Select(p => p.Age).DefaultIfEmpty(0).Max();
9 голосов
/ 03 мая 2013

Или вы можете попробовать это:

(From p In context.Persons Select p Order By age Descending).FirstOrDefault
6 голосов
/ 02 октября 2017

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

context.Persons
.Where(c => c.state == myState)
.Select(c => c.age)
.DefaultIfEmpty(0)
.Max();
5 голосов
/ 25 сентября 2011
maxAge = Persons.Max(c => c.age)

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

2 голосов
/ 29 мая 2014

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

Dim maxAge As Integer = context.Persons.Max(Function(p) p.Age)
1 голос
/ 26 июня 2018

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

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()
0 голосов
/ 28 марта 2019

Ваш столбец может быть пустым

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]
0 голосов
/ 23 января 2019

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

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

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