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>
{
};
(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()附加到每个不同的序列上,以确保在您希望多次使用这些序列的情况下进行最小迭代。