通过EntityFramework获取最新的表值

Eri*_*sen 12 c# entity-framework

我有一个包含多个字段的表,每个字段都由单独的ViewModel单独更新,现在我想获取特定字段的最新值(也许它已在我的表的第五条记录中更新),好吗?现在我写的是这样的:

  public ViewResult ShowPiece()
        {
            var context = new SiteContext();
            var showPiece = context.Portraits.LastOrDefault();
            return View(showPiece);
        }
Run Code Online (Sandbox Code Playgroud)

但是当我运行应用程序并导航到上面的操作时,我得到了错误:

LINQ to Entities无法识别该方法,并且此方法无法转换为商店表达式...

有什么问题?

Ser*_*kiy 28

使用降序排列(按日期,或ID)和FirstOrDefault支持:

var showPiece = context.Portraits
                       .OrderByDescending(p => p.Date)
                       .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

另一种选择是通过子查询选择具有最大日期(id)的肖像(正如Evelie在评论中建议的那样):

var showPiece = context.Portraits
              .FirstOrDefault(p => p.Date == context.Portraits.Max(x => x.Date));
Run Code Online (Sandbox Code Playgroud)

我在这里做了一点调查.在第一种情况下(排序)生成以下查询:

SELECT TOP (1) [t0].*
FROM [Portraits] AS [t0]
ORDER BY [t0].[Date] DESC
Run Code Online (Sandbox Code Playgroud)

在第二种情况下(获得最大值):

SELECT TOP (1) [t0].*
FROM [Portraits] AS [t0]
WHERE [t0].[Date] = ((
    SELECT MAX([t1].[Date])
    FROM [Portraits] AS [t1]
    ))
Run Code Online (Sandbox Code Playgroud)

执行计划几乎相同,但在第二种情况下Top执行两次.因此,与索引扫描相比,Top的成本为0%,这应该不是问题.


Tia*_*ila 8

尝试这样的事情:

var lastShowPieceId = context.Portraits.Max(x => x.Id);
return context.Portraits.FirstOrDefault(x => x.Id == lastShowPieceId);
Run Code Online (Sandbox Code Playgroud)

我遇到过这种情况,这对我有用。