LinqNOT IN查询-基于SQL查询

本文关键字:查询 SQL 基于 LinqNOT IN | 更新日期: 2023-09-27 17:59:28

我正试图弄清楚如何将同一个SQL查询转换为Linq查询,但我看不到像使用SQL那样使用Linq执行not IN的方法。

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

我需要知道有多少不同的[ID]值包含"FAILED"的[Status]值,而不包含"COMPLETED"的[State]值。基本上,如果有一个失败而没有完成,我需要不同的数量。

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>
{
};

LinqNOT IN查询-基于SQL查询

(not) in的粗略等价物是使用Contains()。由于内部子查询不引用外部子查询,您可以这样写:

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();

您可以使用Except方法:

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();

请注意,这不需要在迭代过程中使用Contains。序列将在Except方法中同时进行比较。您还可以将ToArray()附加到每个不同的序列上,以确保在您希望多次使用这些序列的情况下进行最小迭代。