2011-01-09 14 views
1

フォーラムがあり、最近アクティブなトピックのリストを表示しています。最後の返信日までに、または返信のないトピックの場合はトピックの投稿日付順にトピックを注文しています。次のクエリは正常に動作します。LINQ to Entitiesクエリで奇数エラーが発生する

 var topicsQuery = from x in board.Topics 
          let lastActivityDate = x.Replies.Any() 
           ? x.Replies.OrderBy(y => y.PostedDate).Last().PostedDate 
           : x.PostedDate 
          orderby lastActivityDate descending 
          select x; 

このクエリはうまくいきます。ページが読み込まれるたびにトピックが正しく並べられます。しかし、今、私が更新活動を探して、類似したクエリを実行AJAX呼び出しがあります。

 topics = (from x in DBContext.Topics 
        let lastActivityDate = (x.Replies.Any() 
         ? x.Replies.OrderBy(y => y.PostedDate).Last().PostedDate 
         : x.PostedDate) 
        where x.BoardID == boardID 
        where lastActivityDate > lastTopic.PostedDate 
        orderby lastActivityDate 
        select x).ToList<Topic>(); 

を誰もがこのLINQクエリに何かを見ることができますか?

LINQ to Entitiesメソッド 'MyProject.Models.Reply Last [返信](System.Collections.Generic.IEnumerable`1 [MyProject.Models.Reply])メソッドが認識されません。このメソッドをストア式に変換することはできません。

答えて

1

エンティティがまだロードされていないため、汎用リストではなくSQLでLast()が呼び出されるためです。まず、Last()を要求する前にそれらをロードする必要があります。 ボードに既にロードされている汎用リストがあるため、最初の例が機能している可能性があります。

は、以下のことを試してみてください。

topics = (from x in DBContext.Topics.AsEnumerable<Topic>() 
        let lastActivityDate = (x.Replies.Any() 
         ? x.Replies.OrderBy(y => y.PostedDate).Last().PostedDate 
         : x.PostedDate) 
        where x.BoardID == boardID 
        where lastActivityDate > lastTopic.PostedDate 
        orderby lastActivityDate 
        select x).ToList<Topic>(); 

を参照してください:Supported and Unsupported LINQ Methods (LINQ to Entities)

+0

私はあなたが違いを強調することができ、OPのバージョンとの違いを見ることができませんか? –

+0

@ Jani:より多くの文脈で答えを更新しました。 –

+0

@Maheshは怪我をする可能性があります。すべてのトピックをメモリにロードしました.DBMSとアプリケーションサーバにとって非常に高価なソリューションです。それは良い考えではありません。 –

関連する問題