通过EntityFramework获取最新的表值

时间:2013-02-20 13:26:09

标签: c# entity-framework

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

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

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

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

问题是什么?

4 个答案:

答案 0 :(得分:22)

使用降序排序(按日期或ID)和FirstOrDefault supported

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%,这应该不是问题。

答案 1 :(得分:1)

尝试这样的事情:

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

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

答案 2 :(得分:0)

var s = con.Portraits.Where(j => j.Date.HasValue)
                  .OrderByDescending(a => a.Date)
                  .Select(p => p).FirstOrDefault();

答案 3 :(得分:0)

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

但没有人真正有效。

我的解决方案是:

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

        Portraits p = db.Mementos.Find(idPortraits);