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%,这应该不是问题.
尝试这样的事情:
var lastShowPieceId = context.Portraits.Max(x => x.Id);
return context.Portraits.FirstOrDefault(x => x.Id == lastShowPieceId);
Run Code Online (Sandbox Code Playgroud)
我遇到过这种情况,这对我有用。