2009-08-17 8 views
1

IEnumerableを一緒に結合することが可能かどうか疑問に思っています。2一般的なIEnumeratorsに参加する方法

基本的には私はたくさんのユーザーがいて、データベースからコンテンツを取得する必要があるため、検索してページングすることができます。

私はそれが現時点ではLINQ to SQLは、私のコードを使用しています:

 public IEnumerable<content> allcontent; 

     //Get users friends 
     IEnumerable<relationship> friends = from f in db.relationships 
              where f.userId == int.Parse(userId) 
              select f; 

     IEnumerable<relationship> freindData = friends.ToList(); 

     foreach (relationship r in freindData) 
     { 
      IEnumerable<content> content = from c in db.contents 
              where c.userId == r.userId 
              orderby c.contentDate descending 
              select c; 

     // This is where I need to merge everything together 
     } 

私はいくつかの意味を作る願っています!マット・

+0

ありがとうございました! – bExplosion

答えて

1

あなたは、ユーザーが未満2100人の友人がいることを知っている場合、あなたはすでに簡単に戻ってデータベースにロードされたデータからキーを送ることができます:

List<int> friendIds = friendData 
    .Select(r => r.UserId) 
    .Distinct() 
    .ToList(); 

List<content> result = db.contents 
    .Where(c => friendIds.Contains(c.userId)) 
    .ToList(); 

ここで何が起こるには、LINQのはに各IDを変換することですパラメータを指定して、IN句を作成してフィルタ処理を行います。 2100は、SQLサーバーが受け入れるパラメーターの最大数です.2100人を超える友人がいる場合は、IDリストを破棄し、結果リストを結合(Concat)する必要があります。


それとも、あなたがあなたの質問に多くのリテラルの答えをしたい場合は - 、連結方式は、第一及び第二の後、項目から項目を返す新しいのIEnumerableを作成することで、一緒に2 IEnumerablesを組み合わせた方法です。

IEnumerable<content> results = Enumerable.Empty<content>(); 
foreach (relationship r in friendData) 
{ 
    IEnumerable<content> content = GetData(r); 
    results = results.Concat(content); 
} 
+0

ありがとうたくさんの仲間!私はいくつかのことを変更し、より良いLINQステートメントを書くことになったが、これは非常に便利になるだろう! – bExplosion

0

あなたは内部結合をやっている場合は、.Intersect()拡張メソッドを見てください。

0

あなたはどのようなものをマージしていますか?

あなたが使用できる二つの主要なオプションがあります。.SelectMany(...)または.Concat(...)

+0

現在、user1のコンテンツを取得してからuser2のようになります。私は一緒にすべてを併合したいと思っています。だから私はユーザー1 + 2 + 3などで終わる。 – bExplosion

+0

ああ。あなたの "this is is ..."というコメントが私を捨てました。 (それはforループの中にあります) –

6

は、私はあなたがやろうとしているものを正しく理解していれば、なぜあなたはやってみません:

var result = from r in db.relationships 
      from c in db.contents 
      where r.userId == int.Parse(userId) 
      where c.userId == r.UserId 
      orderby c.contentDate descending 
      select new { 
       Relationship = r, 
       Content = c 
      } 

これは、あなたTがフィールドRelationshipContentを持っている匿名型であるIEnumerable<T>を与えるだろう。

関連する問題