簡體   English   中英

具有多列的LINQ子查詢

[英]LINQ subquery with multiple columns

我正在嘗試在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應該是一種更具可讀性的數據庫語言,對嗎?

提供的任何幫助將不勝感激。

只需使用Contains

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

還更好地將policyRegisterIds存儲為HashSet<T>而不是將列表存儲在O(1)而不是List<T>O(n)中:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM