2016-11-20 4 views
1

でLINQにSQLを変換しようと、私は、LINQには、このSQLを変換しようとしています:サブクエリ

SELECT [t0].[ThreadId] FROM [MessageParticipants] AS [t0] 
WHERE EXISTS(
    SELECT threadId 
    FROM [MessageParticipants] AS [t1] 
    WHERE ([t1].[UserId] = 23) 
) 
AND ([t0].[UserId] = 3) 

私はLINQPadに変換しようとしているが、私はそれが

にこれはほとんどの仕事を仕事を得るカント:

var result = from mp2 in MessageParticipants 
      let x = (from mp in MessageParticipants where mp.UserId == 3 select mp.UserId) 
where x.Contains(23) 
select mp2; 

result.Dump(); 

(間違って)上記LINQの結果クエリ

DECLARE @p0 Int = 23 
DECLARE @p1 Int = 3 
SELECT [t0].[Id], [t0].[ThreadId], [t0].[UserId], [t0].[CreatedDate], [t0].[MessageId] 
FROM [MessageParticipants] AS [t0] 
WHERE EXISTS(
    SELECT NULL AS [EMPTY] 
    FROM [MessageParticipants] AS [t1] 
    WHERE ([t1].[UserId] = @p0) AND ([t1].[UserId] = @p1) 
) --> AND should be here not in the inner query 

おそらくもっと良い方法がありますか?

私は、スレッドIDを見つけることによって、ユーザ23とユーザ3がすでに進行中の会話をしているかどうかを調べようとしています。

のでMessageParticipantsテーブルは次のようになります。

Id, ThreadId, UserId 
-------------------- 
1 52  23 
2 52  3 
3 11  20 
+0

あなたの条件が実際に(すべてのt0でテーブルからすべての情報を使用していない)ものをフィルタリングしないEXISTS奇妙な。 – Evk

+0

最初のクエリは意味がありません。なぜなら、それを含んでいるクエリに再び参加することはないからです。そうでないと、そのテーブルにはユーザーが23のエントリが含まれているだけです。たぶんあなたは、あなたが戻ったりフィルタをかけようとしていることを何と言っても英語で書くことができますか? – Igor

+0

@Igorはさらに詳しい情報を追加しました – n3tx

答えて

2

私はあなたのSQLが少しオフになっていると信じて、あなたはそれ自体にテーブルの上に参加して、IDの場所を使用するを使用する必要があります。ここに更新されたSQLとスレッドIDを取得するために対応するlinqの下にあります。

-- create in memory table for testing 
DECLARE @MessageParticipants table (Id INT identity, ThreadId int, UserId int) 
insert into @MessageParticipants(ThreadId, UserId) values (52,23), (52,3), (11, 20),(11, 3) 

SELECT [t0].[ThreadId] 
FROM @MessageParticipants AS [t0] 
INNER JOIN @MessageParticipants AS [t1] ON t0.ThreadId = t1.ThreadId 
WHERE [t1].[UserId] = 3 AND [t0].[UserId] = 23 

のLINQ文の

var result = from m1 in MessageParticipants 
    join m2 in MessageParticipants on m1.ThreadId equals m2.ThreadId 
    where m2.UserId == 3 && m1.UserId == 23 
    select m1.ThreadId; 

var thread = result.FirstOrDefault(); 
+1

ありがとうございます! – n3tx