我正在试图弄清楚如何将这个相同的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]值包含[Status]值为“FAILED”且不具有[Status]“COMPLETED”的[Status]值。基本上,如果没有完成失败,我需要不同的金额。
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>
{
};
答案 0 :(得分:1)
(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();
答案 1 :(得分:0)
您可以使用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()添加到每个不同的序列上,以确保在您想要多次使用这些序列的情况下进行最小的迭代。