我试图在LINQ中重新创建这个SQL查询:
SELECT *
FROM Policies
WHERE PolicyID IN(SELECT PolicyID
FROM PolicyRegister
WHERE PolicyRegister.StaffNumber = @CurrentUserStaffNo
AND ( PolicyRegister.IsPolicyAccepted = 0
OR PolicyRegister.IsPolicyAccepted IS NULL ))
两个表的关系图:
到目前为止,这是我的尝试:
var staffNumber = GetStaffNumber();
var policyRegisterIds = db.PolicyRegisters
.Where(pr => pr.StaffNumber == staffNumber && (pr.IsPolicyAccepted == false || pr.IsPolicyAccepted == null))
.Select(pr => pr.PolicyID)
.ToList();
var policies = db.Policies.Where(p => p.PolicyID.//Appears in PolicyRegisterIdsList)
我想我已经关闭,可能会制作两个列表并以某种方式使用Intersect()但我今天早上查看了我的代码,并认为必须有一个更简单的方法来执行此操作。 LINQ应该是一种更易读的数据库语言吗?
非常感谢提供的任何帮助。
答案 0 :(得分:2)
只需使用Contains
:
var policies = db.Policies.Where(p => policyRegisterIds.Contains(p.PolicyID));
还可以更好地将policyRegisterIds
存储为HashSet<T>
,而不是O(1)
而不是O(n)
List<T>
中的搜索列表:
var policyRegisterIds = new HashSet<IdType>(db.PolicyRegisters......);
但更好的是删除ToList()
并将其全部作为数据库中的一个查询发生:
var policyRegisterIds = db.PolicyRegisters.Where(pr => pr.StaffNumber == staffNumber &&
(pr.IsPolicyAccepted == false || pr.IsPolicyAccepted == null));
var policies = db.Policies.Where(p => policyRegisterIds.Any(pr => pr.PolicyID == p.PolicyID));