Ответ 1
Попробуйте int maxAge = context.Persons.Max(p => p.Age);
И убедитесь, что у вас есть using System.Linq;
в верхней части файла
Чтобы получить максимальное значение столбца, содержащего целое число, я могу использовать следующую команду 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
maxAge = Persons.Max(c => c.age)
или что-то в этом роде.
Может быть, помощь, если вы хотите добавить некоторый фильтр:
context.Persons
.Where(c => c.state == myState)
.Select(c => c.age)
.DefaultIfEmpty(0)
.Max();
В VB.Net это будет
Dim maxAge As Integer = context.Persons.Max(Function(p) p.Age)
Как многие говорили - это версия
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()
Выбранный ответ вызывает исключения, а в ответе Карлоса Толедо применяется фильтрация после извлечения всех значений из базы данных.
Следующий запускает один цикл и читает одно значение, используя любые возможные индексы без исключения.
int maxAge = _dbContext.Persons
.OrderByDescending(p => p.Age)
.Select(p => p.Age)
.FirstOrDefault();
Ваша колонка обнуляется
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]