[英]LINQ query - join and where clause not being obeyed?
我有一個鏈接查詢,其中有一個簡單的聯接到幾個表和一個where子句,出於某些奇怪的原因,該查詢似乎並沒有遵循where子句。
我的查詢如下:
from p in Platforms
join c in Compartments on p.Id equals c.PlatformId
join ci in CompartmentItems on c.Id equals ci.CompartmentId
where p.Id == 4042 && !ci.Archived && !c.Archived
select c
一個簡單的linqpad screnshot顯示,將CompartmentItems
附加到了Compartments
,而不管它們是否已歸檔。
感覺我在這里很忙,有人可以幫助我確定查詢的問題嗎?
任何想法表示贊賞。
編輯:所以我回過頭來,更詳細地研究了這個問題,並確定了為什么我只退回了車廂。 這是由於存儲庫通常僅返回域類型以供使用。 結果,在不引入單個隨機DTO類型對象的情況下,我不能返回多個實體類型(其他存儲庫都沒有返回域類型以外的任何東西)。
因此,考慮到這一點,我有4個選擇:
對最佳方法有何想法?
您要帶走隔間,將其與隔間項目連接在一起,過濾掉一些隔間項目,然后僅選擇隔間,然后完全 忽略所有加入表的隔間項目 ,然后使用完全不同的機制來獲取所有隔間每個隔離專區的隔離專區項目,即使用內置的關系屬性。
要僅獲取與給定過濾器匹配的隔離專區項目,您實際上需要選擇出使用select
子句過濾的隔離專區項目,然后不使用Include
將其全部Include
在內。 這可能看起來像:
from p in Platforms
join c in Compartments on p.Id equals c.PlatformId
join ci in CompartmentItems.Where(ci => !ci.Archived)
on c.Id equals ci.CompartmentId into compItems
where p.Id == 4042 && !c.Archived
select new
{
Compartment = c,
CompartmentItems = compItems,
}
查看SQL查詢本身。 我確定它會遵守您的過濾條件。 我敢打賭,您會延遲加載,這就是為什么您看到所有CompartmentItems的原因。
或者,如果您不使用SQL后端,則必須在Compartment和CompartmentItems之間建立關系。 當您使用導航屬性時,它將返回所有隔離專區。
這里沒有錯誤。
嘗試使用所有CompartmentItems.Archived = 1創建一個隔間。您將看到此語句不會返回該隔間。
嘗試這樣做。
from p in Platforms
join c in Compartments on p.Id equals c.PlatformId
join ci in CompartmentItems on c.Id equals ci.CompartmentId
where p.Id == 4042
where !ci.Archived
where !c.Archived
select c
它可以解決鏈接嘗試查詢屬性的相同記錄的問題。 當邏輯由&&分隔時,似乎將其讀入機器
p.Id == 4042 && !p.Archived && !p.Archived
這是LINQ僅使用列表中的第一項應用屬性過濾器的結果,而與其余項的差異無關。
Linq用into子句和where條件連接
var li = (from cert in db.tbl_ISOCetificate
join comCert in db.tbl_ComGroupCertificate.Where(x=>x.GroupID ==GroupID) on cert.Cert_id equals comCert.CerID into jo
from b in jo.DefaultIfEmpty()
select new { cert.Cert_id, cert.Cert_Name}).ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.