2009-08-11 13 views
10

私はLINQとLINQ to SQLを初めて使用しましたが、このコードで何が問題なのか理解していません。 Excetpion.Messageを取得しました.NET:LINQのLast()

"クエリ演算子 'Last'はサポートされていません。

私がしようとしているのは、最も遅いLastActivityUtcを最新の100から取り除くことです。コードは次のとおりです。その後、

var postTimes = from post in db.Post 
       where post.LastActivityUtc != null 
       orderby post.LastActivityUtc descending 
       select post.LastActivityUtc; 

DateTime startDate = DateTime.MinValue; 

if (postTimes.Count() >= 2) 
{ 
    startDate = postTimes.Take(100).Last().Value; 
} 

答えて

20

ブランドンがソリューションを掲載しているが、それは、メモリ内のリスト全体をコピーする必要があります。あなただけの、あなたがAsEnumerable使用することができ、処理中にデータベースクエリから「移行」したい場合

startDate = postTimes.Take(100).AsEnumerable().Last().Value; 

が、あなたはおそらく行うことを言って以前ToListメソッド()を呼び出したいのですが、

var postTimes = (from post in db.Post 
       where post.LastActivityUtc != null 
       orderby post.LastActivityUtc descending 
       select post.LastActivityUtc).Take(100).ToList(); 

DateTime startDate = DateTime.MinValue; 

if (postTimes.Count >= 2) 
{ 
    startDate = postTimes.Last().Value; 
} 

いったんデータベースクエリを実行するが、唯一のフェッチされます: - 数のために、一度最後の値に対して一度クエリを実行することを避けるために最初の100レコードをメモリに保存します。もちろん、他の場所でpostTimesを使用しようとすると、それはやや落ちます...

+1

ラット、明らかに、私の最初の答えは全く馬鹿ではなかった!私はマークにそれを責める;) –

+0

@Mehrdad - 私は謙虚に責任を受け入れる! – Marc

+2

もっと愚か者は誰ですか?愚か者、または彼に従う愚か者? –

4
postTimes上

コール.ToList()と.Lastを使用してみてください()

startDate = postTimes.Take(100).ToList().Last().Value; 
+1

これはうまくいくでしょうが、あなたが言及した理由ではありません。 '.ToList()'の代わりに '.AsEnumerable()'も動作します。これらの2つの理由は、式をSQLに変換しようとしないことです。彼らは単に100行を取得し、それをクライアント上で処理します。 –

+0

私の間違い、私は私の答えのその部分を削除します。 – Brandon