如何使用Entity Framework获取列的最大值?

问题描述 投票:73回答:9

要获得包含整数的列的最大值,我可以使用以下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.?
c# sql entity-framework max
9个回答
125
投票

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

并确保您的文件顶部有using System.Linq;


36
投票

如果列表为空,我会得到一个例外。此解决方案将考虑此问题:

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

9
投票

或者你可以尝试这个:

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

6
投票

也许有帮助,如果你想添加一些过滤器:

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

5
投票
maxAge = Persons.Max(c => c.age)

或类似的规定。


2
投票

在VB.Net中它会是

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

1
投票

正如许多人所说 - 这个版本

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
投票

选定的答案会抛出异常,Carlos Toledo的答案在从数据库中检索所有值后应用过滤。

下面的一个运行单个往返并使用任何可能的索引读取单个值,没有例外。

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

-1
投票

您的专栏可以为空

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]
© www.soinside.com 2019 - 2024. All rights reserved.