我有一个包含多个字段的表,每个字段都由单独的ViewModel单独更新,现在我想获取特定字段的最新值(也许它已在我的表的第五条记录中更新),好吗?现在我写的是这样的:
public ViewResult ShowPiece()
{
var context = new SiteContext();
var showPiece = context.Portraits.LastOrDefault();
return View(showPiece);
}
但是当我运行应用程序并导航到上面的操作时,我得到了错误:
LINQ to Entities无法识别该方法,并且此方法无法转换为商店表达式...
问题是什么?
答案 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);