具有多列

时间:2017-09-13 08:43:24

标签: c# sql-server linq

我试图在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 )) 

两个表的关系图:

Relationship Diagram

到目前为止,这是我的尝试:

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应该是一种更易读的数据库语言吗?

非常感谢提供的任何帮助。

1 个答案:

答案 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));