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

时间:2011-09-24 21:23:42

标签: c# sql entity-framework max

要获取包含整数的列的最大值,我可以使用以下T-SQL命令

SELECT MAX(expression )
FROM tables
WHERE predicates;

是否可以使用实体框架获得相同的结果。

假设我有以下型号

public class Person
{
  public int PersonID { get; set; }
  public int Name { get; set; }
  public int Age { get; set; }
}

如何让年龄最大的人年龄?

int maxAge = context.Persons.?

10 个答案:

答案 0 :(得分:121)

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

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

答案 1 :(得分:34)

如果列表为空,我会收到异常。此解决方案将考虑此问题:

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

答案 2 :(得分:9)

或者你可以试试这个:

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

答案 3 :(得分:5)

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

或类似的东西。

答案 4 :(得分:5)

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

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

答案 5 :(得分:2)

VB.Net 中,它将是

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

答案 6 :(得分:2)

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

此版本,如果列表为空

  • 返回null ―可为空的重载
  • 抛出Sequence contains no element异常―用于不可为空的重载

-

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

此版本处理空列表的情况,但它会生成更复杂的查询,并且由于某些原因不适用于EF Core。

-

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

此版本优雅且高效(简单查询和数据库单次往返),可与EF Core一起使用。它通过将非可空类型强制转换为可空类型,然后使用??运算符应用默认值来处理上述异常。

答案 7 :(得分:1)

很多人说-这个版本

template<class T> T from_string(std::string const& s);
template<> int      from_string<int>(std::string const& s)    { return std::stoi(s); }
template<> double   from_string<double>(std::string const& s) { return std::stod(s); }
// And so on.

template<class... Ts, size_t... Idxs>
std::tuple<Ts...>
parse(std::vector<std::string> const& values, std::index_sequence<Idxs...>) {
    return {from_string<Ts>(values[Idxs])...};
}

表为空时引发异常。

使用

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

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

答案 8 :(得分:0)

选择的答案将引发异常,而Carlos Toledo的答案将在从数据库中检索所有值之后应用过滤。

下面的代码运行一次往返,并使用任何可能的索引无例外地读取单个值。

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

答案 9 :(得分:0)

您的列为空

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]