![](/img/trans.png)
[英]How to get max value of related entity in Entity Framework most effectively
[英]How to get max value of a column using Entity Framework?
要获取包含整数的列的最大值,我可以使用以下 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.?
试试这个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
也许有帮助,如果你想添加一些过滤器:
context.Persons
.Where(c => c.state == myState)
.Select(c => c.age)
.DefaultIfEmpty(0)
.Max();
您的列可以为空
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]
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 配合使用。 它通过将不可空类型转换为可空类型,然后使用??
应用默认值来处理上面提到的异常。 操作员。
maxAge = Persons.Max(c => c.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()
在VB.Net 中,它将是
Dim maxAge As Integer = context.Persons.Max(Function(p) p.Age)
选定的答案会引发异常,而来自 Carlos Toledo 的答案会在从数据库中检索所有值后应用过滤。
下面的代码运行单次往返并读取单个值,使用任何可能的索引,无一例外。
int maxAge = _dbContext.Persons
.OrderByDescending(p => p.Age)
.Select(p => p.Age)
.FirstOrDefault();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.