2017-09-13 107 views
1

我试图重新在LINQ这个SQL查询:LINQ子查询多列

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) 

我想我很接近,可能会做两个列表并使用Inters ect()不知何故,但我今天早上看了我的代码,并认为必须有一个更简单的方法来做到这一点。 LINQ应该是一个更可读的数据库语言吧?

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

+2

db.Policies.Where(P => policyRegisterIds。载有(p.PolicyID)) – jitender

+1

尝试'policyRegisterIds.Contains(p.PolicyID)',但最好尽量减少请求的数量 – ASpirin

+2

你在'Policies'和'PolicyRegisters'之间有一个虚拟关系吗?包含问题 – meorfi

回答

2

只需使用Contains

var policies = db.Policies.Where(p => policyRegisterIds.Contains(p.PolicyID)); 

也更好地存储policyRegisterIdsHashSet<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)); 
+2

竖起大拇指'HashSet '建议 –

+1

@EhsanSajjad - 我也喜欢它:)如果它在记忆linq我会去肯定 –

+0

谢谢,这是一个很好的帮助:) – TridentTrue