2016-08-01 5 views
0

私はLINQクエリにこの同じSQLクエリを変換する方法を把握しようとしているが、私はあなたがでできるようにLINQでNOT IN行う方法を見ていませんよSQL。LINQのクエリではありません - SQLクエリに基づいて

SELECT COUNT(DISTINCT ID) 
FROM References 
WHERE ID NOT IN (
    SELECT DISTINCT ID 
    FROM References 
    WHERE STATUS = 'COMPLETED') 
AND STATUS = 'FAILED' 

私はまた、「完了」の[ステータス]を持っていない「FAILED」の[ステータス]の値が含まれているものが存在するどのように多くの異なる[ID]の値を知る必要があります。基本的に、完了せずに失敗した場合、私はそれのための別の金額が必要です。

var query_5 = from r in Records where r.ID NOT IN(from r in Records where 
r.Record_Status == "COMPLETED") && (r.Record_Status == "FAILED") 
select r.ID; 

var rec_5 = query_5; 
Console.WriteLine(rec_5.Distinct()); 

これはこれを試みたものですが、コードを作成する正しい方法ではないため、多数のエラーが発生しています。どのようにこれを達成するための任意の例は非常に感謝される!

これは残りの設定方法です。

public class References 
{ 
    public string ID; 
    public string Record_Status; 
} 

public static List<References> Records = new List<References> 
{ 
}; 
+1

可能な重複http://stackoverflow.com/questions/183791/how-would-you-do-a-not-in-query- with-linq) –

答えて

1

(not) inの概略的等価物はContains()を使用しています。内側のサブクエリが外側を参照していないので、あなたはこのようにそれを書くことができます:これは使用しては反復中に含まれて必要としないこと

var completed = 
    (from r in References 
     where r.Record_Status == "COMPLETED" 
     select r.Id).Distinct(); 

var failed = 
    (from r in References 
     where r.Record_Status == "FAILED" 
     select r.Id).Distinct(); 

var countFailedNotCompleted = failed.Except(completed).Count(); 

注:

var completedIds = 
    (from r in ctx.References 
    where r.Status == "COMPLETED" 
    select r.Id).Distinct(); 

var count = 
    (from r in ctx.References 
    where !completedIds.Contains(r.ID) 
    where r.Status == "FAILED" 
    select r.Id).Distinct().Count(); 
+0

ctxとは何ですか?それをどう定義するのですか? – Alex

+0

これは、クエリを実行するために使用しているデータコンテキストです。しかし、あなたの場合は、すべてを一緒に落とすことができるように見えます。 –

+0

完璧に動作します、ありがとう! – Alex

0

あなたがこの方法を除き使用することができます。シーケンスはExceptメソッド内で一度にすべて比較されます。 ToArray()を別々のシーケンスにタックして、それらのシーケンスを複数回使用する必要がある場合に最小の反復を保証することもできます。 [あなたはLINQクエリで「ないで」だろうどのように?](の

関連する問題