簡體   English   中英

如何使用實體框架獲取列的最大值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM