2013-02-20 39 views
4

我有一个表有多个字段,每个表分别由不同的ViewModel更新,现在我想获取特定字段的最新值(可能它已更新为第五个记录我的桌子),好吗?现在我有什么写是这样的:通过EntityFramework获取表格的最新值

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

但是当我运行的应用程序和浏览上面的动作,我thie错误:

LINQ到实体无法识别方法,该方法不能被翻译成商店的表达式...

这是什么问题?

回答

16

使用降序排序(按日期,或ID)和FirstOrDefaultsupported

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成本为0%,这应该不成问题。

+0

出于好奇..威尔OrderByDescending然后FirstOrDefault居然挑头没有订购或将例如最大的日期为性能更好,他只会抢最高日期? – Evelie 2013-02-20 13:31:09

+0

@Evelie实际上你不能只选择Max,因为需要整个记录 – 2013-02-20 13:54:45

+0

FirstOrDefault(c => c.Date == context.Portraits.Max(d => d.Date))不会命令它并且工作。但我的观点并不是提供更好的解决方案,只是想知道你的解决方案是否实际排序条目 – Evelie 2013-02-20 14:24:13

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

这将选择单个字段,而不是整个实体 – 2013-02-20 13:51:30

+0

现在先生怎么样? ':)' – spajce 2013-02-20 14:00:17

+0

这个答案并没有增加任何新东西。无需检查日期是否可以为空; EF将通过元模型检查它是否为空值; Select方法不需要;基本上它和谢尔盖的答案是一样的 – 2015-11-09 20:49:36

0

尝试是这样的:

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

我有这样的情况,这为我工作。

0

我试过了你在这里的每一个回复。

但没有人真的有工作。

我的解决办法是:

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

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