2013-02-20 2 views
4

У меня есть таблица с несколькими полями, и каждый из них обновляется отдельно с помощью отдельной модели ViewModel. Теперь я хочу получить последнее значение определенного поля (возможно, оно обновлено в пятой записи мой стол), хорошо? что теперь у меня есть на запись выглядит следующим образом:Получить последнее значение таблицы через EntityFramework

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

но при запуске приложения и перейдите выше действия, я получил Thie Ошибка:

LINQ к Entities не распознает метод, и этот метод не может быть переведены в выражение магазина ...

В чем проблема с этим?

ответ

16

Используйте нисходящий порядок (по дате, или идентификатор) и 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 стоит 0% по сравнению с Index Scan, это не должно быть проблемой.

+0

из любопытства .. Будет OrderByDescending, а затем FirstOrDefault на самом деле выбрать первый без заказа или же, например, Макс на сегодняшний день лучше для производительности, где он будет просто захватить самую высокую дату? – Evelie

+0

@Evelie на самом деле вы не можете просто выбрать Max, потому что нужна целая запись –

+0

FirstOrDefault (c => c.Date == context.Portraits.Max (d => d.Date)) не заказывал и не работал. Но моя точка зрения не заключалась в том, чтобы обеспечить лучшее решение вопроса. Просто хотелось узнать, действительно ли ваше решение сортирует записи или нет. – Evelie

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

Это будет выбирать одно поле вместо целого объекта –

+0

как насчет sir? ':)' – spajce

+0

Этот ответ не добавляет ничего нового. Нет необходимости проверять, является ли Date нулевым или нет; EF будет проверять наличие нулей через метамодель; Метод Select не нужен; По сути, это то же самое, что и ответ Сергея –

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); 
Смежные вопросы