2016-10-14 11 views
0

最初にいくつかのコードを表示してから、私が欲しいものを教えようとします。LINQリスト内のリストを選択する

Thread thread = db.Threads 
      .AsNoTracking() 
      .FirstOrDefault(x=>x.Name == name); 

var threadTopics = db.Topics 
      .AsNoTracking() 
      .Where(x => x.ThreadId == thread.Id && x.PinType != PinType.Advertisement) 
      .ToList(); 

thread.Topics = threadTopics; 

基本的に、私は話題と私のスレッドをしたいが、私はすべてのトピックを必要としない、私は「ない広告」のトピックのみ必要です。これは私のために働くが、私は1つの要求でこれを行うことができると思うが、私は方法が分からない。

は、私はこれを試してみましたが、それは働いていない:

Thread thread = db.Threads 
      .AsNoTracking() 
      .Where(x=>x.Name == name) 
      .Select(x=> new Thread 
      { 
       Topics = x.Topics.Select(x=>x.PinType != PinType.Advertisement) 
      }); 

モデル:

class Thread { 
    int ThreadId {get;set;} 
    ICollection<Topic> Topics {get;set;} 
} 
class Topic { 
    int TopicId {get;set;} 
    int ThreadId {get;set;} 
    Thread Thread {get;set;}  
    PinType PinType {get;set;} 
} 
+0

あなたのモデルがあなたの関係を理解するのに役立つでしょう(そしてSOはソーシャルチャットサイトではありません:) –

+0

いいえ、これは動作しません。私はTopics.PinTypeを使うことはできません。TopicsはCollectionです.PinTypeを調べるにはTopicが必要です。 – Evgenii

+0

次に、 '.Where(x => x.Topics.Any(y => y.PinType!= PinType.Advertisement))'が必要です。 –

答えて

0
Thread thread = db.Threads 
     .AsNoTracking() 
     .Where(x=>x.Name == name) 
     .Select(x=> new Thread 
     { 
      Topics = x.Topics.Select(x=>x.PinType != PinType.Advertisement) 
     }); 

左側が右側がIEnumberableあるスレッドです。そしてあなたはまた新しいスレッドでIDを逃す。変更し :

var threads = db.Threads 
     .AsNoTracking() 
     .Where(x=>x.Name == name) 
     .Select(x=> new Thread 
     { 
      ThreadId = x.ThreadId, 
      Topics = x.Topics.Where(x=>x.PinType != PinType.Advertisement).ToList() 
     }); 

たぶん、あなたはその後、我々は、これは私が望んでいたように働いている

Thread thread = db.Threads 
     .AsNoTracking() 
     .Where(x=>x.Name == name) 
     .Select(x=> new Thread 
     { 
      ThreadId = x.ThreadId, 
      Topics = x.Topics.Where(x=>x.PinType != PinType.Advertisement).ToList() 
     }).FirstOrDefault(); 
+0

トピック= x.Topics.Select(x => x.PinType!= PinType.Advertisement)ここでエラー 'IEnumerable をICollection に変換できません。そしてSelectの代わりにWhereを使用すると、IEnumerable をICollection に変換できません。 – Evgenii

+0

申し訳ありません、それはどこにあるべきですか。私は私の答えを編集する –

0

にこれを簡略化することができ

Thread thread = threads.FirstOrDefault(); 

を必要としています。最初に私は必要なスレッドを探して、それを見つけた後、私はそれからいくつかのトピックを削除します。 1回のリクエストでこれをやりたかったのですが、これも「OK」と思います。

Thread thread = db.Threads 
      .AsNoTracking() 
      .FirstOrDefault(x=>x.Name == name); 

thread.Topics = thread.Topics.Where(x => x.PinType != PinType.Advertisement).ToList(); 
関連する問題