2017-01-18 11 views
1

私は同様の質問のカップルを通過したが、私が望むものを見つけることができませんでした。LINQの条件でEXISTSを使用するには?

「回答」テーブルにIDを持つタグを見つける必要があります。なぜなら、重複を処理するために必要なタグIDを含む複数の回答レコードが存在する可能性があるからです。これが単純な結合を行うことができない理由です。

私はEXISTSを使用することを考えましたが、まだそれを行う方法を理解できませんでした。

これは、これは私が誰かが正しくLINQでこのクエリを実装する方法を提案することができればそれが参考になるノー成功

(from tag in Tags 
where tag.Id.Any(from ans in Answers 
        where ans.StID == tag.Id 
        && tag.SchId == 472 
        && ans.isValid == true 
        select ans.ID) 
select tag.TagName 

とLINQにしようとしたものです作業SQL

SELECT DISTINCT TagName 
FROM Tags tag 
JOIN Answers ans ON ans.StID = tag.Id 
WHERE tag.SchId = 472 
AND ans.isValid = 1 

です。

+0

この投稿は、「すべて」がそれを行う方法であることを示唆しています。 http://stackoverflow.com/questions/4074013/how-to-do-a-sql-where-exists-in-linq-to-entities。 'Any'を使ったとき、それはしませんでしたか?どのようにチェックしていますか? –

+0

'ここでtag.SchId == 472 && Answers.Any(ans => ans.StID == tag.Id && ans.isValid)' –

+0

@PeterRitchieいいえ、それはタイプintと言っていますか? (これはタグIDの一種ではありません)Any –

答えて

0

あなたの重複を取り除くDistinctメソッドを調べてください。以下のコードを試してみてください。

(from tag in Tags 
where tag.Id.Any(from ans in Answers 
        where ans.StID == tag.Id 
        && tag.SchId == 472 
        && ans.isValid == true 
        select ans.ID).Distinct(ans => ans.ID) 
select tag.TagName 
1

あなたは、一般的にあなたのコレクション内のすべてのアイテムが与えられた基準を満たすかどうかをチェックする関数に渡すことEnumerable.Any()方法を使用することによって、これを達成したいと思う:

var x = Tags.Where(t => t.SchId == 472 && Answers.Any(a => a.StId == tag.Id && a.isValid)) 
      .Select(t => t.TagName) 
      .Distinct(); 

これはあなたを与える必要がありますSchIdが472で、少なくとも1つの有効な回答を持つ別個のタグのリスト。

関連する問題