17

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

  public ViewResult ShowPiece()
        {
            var context = new SiteContext();
            var showPiece = context.Portraits.LastOrDefault();
            return View(showPiece);
        }

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

LINQ to Entities 无法识别该方法,并且该方法无法转换为存储表达式...

那有什么问题?

4

4 回答 4

45

使用降序(按日期或 id)FirstOrDefault并且支持

var showPiece = context.Portraits
                       .OrderByDescending(p => p.Date)
                       .FirstOrDefault();

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

var showPiece = context.Portraits
              .FirstOrDefault(p => p.Date == context.Portraits.Max(x => x.Date));

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

SELECT TOP (1) [t0].*
FROM [Portraits] AS [t0]
ORDER BY [t0].[Date] DESC

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

SELECT TOP (1) [t0].*
FROM [Portraits] AS [t0]
WHERE [t0].[Date] = ((
    SELECT MAX([t1].[Date])
    FROM [Portraits] AS [t1]
    ))

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

于 2013-02-20T13:27:43.690 回答
4

尝试这样的事情:

var lastShowPieceId = context.Portraits.Max(x => x.Id);
return context.Portraits.FirstOrDefault(x => x.Id == lastShowPieceId);

我有这种情况,这对我有用。

于 2017-03-06T19:54:34.063 回答
0
var s = con.Portraits.Where(j => j.Date.HasValue)
                  .OrderByDescending(a => a.Date)
                  .Select(p => p).FirstOrDefault();
于 2013-02-20T13:48:10.250 回答
-2

我已经尝试了您在这里的所有回复。

但没有人真正工作过。

我的解决方案是:

        List<Portraits> portraitsList = db.Portraits.ToList();
        int idPortraits = portraitsList.Last().PortraitsId;
        portratisList.Remove(portratisList.Last());

        Portraits p = db.Mementos.Find(idPortraits);
于 2017-11-02T14:42:30.087 回答