17

複数のフィールドを持つテーブルがあり、それぞれが個別の ViewModel によって個別に更新されます。特定のフィールドの最新の値を取得したいです (テーブルの 5 番目のレコードで更新された可能性があります)。今私が書いているのは次のようなものです:

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

しかし、アプリケーションを実行して上記のアクションに移動すると、エラーが発生しました:

LINQ to Entities はメソッド を認識せず、このメソッドはストア式に変換できません...

それの何が問題なの??

4

4 に答える 4

45

(日付またはIDによる)降順を使用し、サポートさFirstOrDefaultれているもの:

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

2番目の場合(最大値を取得):

SELECT TOP (1) [t0].*
FROM [Portraits] AS [t0]
WHERE [t0].[Date] = ((
    SELECT MAX([t1].[Date])
    FROM [Portraits] AS [t1]
    ))

実行プランはほぼ同じですが、2番目のケースではTopが2回実行されます。したがって、トップはインデックススキャンと比較して0%のコストがかかりますが、これは問題にはなりません。

于 2013-02-20T13:27:43.690 に答える
0
var s = con.Portraits.Where(j => j.Date.HasValue)
                  .OrderByDescending(a => a.Date)
                  .Select(p => p).FirstOrDefault();
于 2013-02-20T13:48:10.250 に答える