2013-02-20 14 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); 
相關問題