簡體   English   中英

LINQ查詢-加入和不遵守where子句?

[英]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個選擇:

  1. 為此目的創建一個隨機的DTO
  2. 查詢數據庫兩次,並獲取隔離專區項作為第二個查詢
  3. 從存儲庫返回一個IQueryable(同樣,在其他任何地方都不會執行此操作)
  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.

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