2011-01-13 17 views
1

私はビューモデル(下記)を持っています。コレクションをメモリにソートせずにビューモデルを作成する方法

public class TopicsViewModel 
{ 
    public Topic Topic { get; set; } 
    public Reply LastReply { get; set; } 
} 

私は私のIQueryable<Topic>収集とIQueryable<Reply>コレクションからの値でIQueryable<TopicsViewModel>を移入します。私はそのトピックの最後の返信だけを必要とし、Topic.Replies.Last()を実行することで、エンティティコレクション全体をメモリにロードしてから、最後に返されたエンティティコレクションを取得するので、添付されたエンティティコレクション(Topic.Replies)リスト。私はクエリがデータベース内で実行されるようにIQueryableにとどまっています。

私はまた、IQueryable<Topic>をループすると遅延読み込みが開始されるため、トピックとクエリreplyRepository.Repliesをforeachしたくありません。私は1つの表現を作成し、すべての脚の作業を下層で行うことを好むでしょう。

私は次があります。

IQueryable<TopicsViewModel> topicsViewModel = from x in topicRepository.Topics 
               from y in replyRepository.Replies 
               where y.TopicID == x.TopicID 
               orderby y.PostedDate ascending 
               select new TopicsViewModel { Topic = x, LastReply = y }; 

しかし、これは動作しません。どのようにIQueryableまたはIEnumerableのTopicsViewModelを作成してデータベースと検索トピックとそのトピックの最後の返信をクエリできるようにするためのアイディアですか?私はその話題に関連したすべての返答を避けるために本当に頑張っています。私は最後の返事をつかみたいだけです。

提供していただきありがとうございます。

+0

トピックと返信の間にナビゲーションプロパティがありますか? –

+0

はい、それは私が話した添付エンティティコレクションです。しかし、私はそのナビゲーションプロパティにアクセスしてそのコレクション全体の遅延読み込みをトリガしたくありません。そのコレクション内のすべてのアイテムが必要な場合はそれが意味をなさきますが、コレクション内の最後のアイテムだけが必要なので、何とかIQueryableに残る方がよいでしょう。 – Chev

+0

「動作していません」と言うと、正確にどの部分が動作していないのですか?実行時例外、何も返されない、またはすべてが返されます..? –

答えて

1

誰も応答していないので、私は現在、foreachソリューションを使用しています。私は最終的には怠け者になるだろうと思っている話題を見ているのは、コレクションの最後のオブジェクトにアクセスできるように、返信のコレクションを入れるよりはるかに優れているということです。ここで

私は今のところ何をしたかである:

   List<TopicsViewModel> topicsViewModelList = new List<TopicsViewModel>(); 
       foreach (Topic topic in topics) 
       { 
        Reply lastReply = replyRepository.GetRepliesBy_TopicID(topic.TopicID).OrderBy(x => x.PostedDate).LastOrDefault(); 

        topicsViewModelList.Add(new TopicsViewModel 
        { 
         Topic = topic, 
         LastReply = lastReply 
        }); 
       } 

私はちょうどその最終結果(データの適切なページングがループする前に行われることを確保するように)をループ、最初に私のIQueryable<Topics>をロードしています最後の返信で読み込みます。これは、回答の集まりを埋めることを避け、代わりに各トピックの最後の返事だけをつかむようです。

+1

topicsViewModelListをインスタンス化する必要はありませんか? – Grubsnik

+0

はい、そうです! +1を訂正します。 – Chev

0
 from r in replies 
     group r by new { r.TopicId } into g 
     select new 
      { 
       TopicId = g.Key.TopicId, 
       LastReply = g.Max(p => p.PostedDate) 
      } 
+0

それは問題ではありません。ナビゲーションプロパティエンティティコレクションを照会しようとすると、ENTIREコレクションの遅延ロードがトリガーされます。その後、LINQは.First()または.Last()を実行しますが、コレクション全体がメモリにロードされたシーンの背後で、コレクション内の最初または最後のオブジェクトを取得します。 – Chev

+0

真。だから、ここで唯一の選択肢は、.Max()関数を使うことです。 –

+0

SelectManyと.Max()を組み合わせた良い例が見つかりました。 http://stackoverflow.com/questions/2462261/linq-to-sql-select-targets-with-max-date –

関連する問題