我有一個這樣的Linq陳述句:
IQueryable ActiveContract = (
from c in context.Contracts
join a in context.Abonents on c.AbonentID equals a.ID
where a.ID != null && c.Hidden != true && c.Status == activeContractStatus)
它生成了以下的查詢:
SELECT
...合同屬性...
FROM [dbo].[Contracts] AS [Extent1]
WHERE ([Extent1].[AbonentID] IS NOT NULL) AND (1 <> [Extent1].[Hidden]) AND ([Extent1].[Status] = @p__linq__0)
我看過這個答案。強迫linq執行內部連接。
但是在我的案例中Contracts.AbonentID是空的,不幸的是:
- 除了
ID之外,Abonents中的所有其他屬性都是可忽略的。 - 有一個
Abonent的所有屬性,除了Abonent.ID是空的,這是完全正常的(在商業邏輯中)(所以我不能在Abonents的where子句中添加任何not null檢查)。 - 我只需要與Abonents相連的合同。
- 有很多情況下,
Contracts.AbonentID會導致無處可尋(沒有Abonent與這樣的ID)。
是否有辦法生成類似于:
的東西?SELECT
...合同屬性...
FROM [dbo].[Contracts] AS [Extent1] 。
INNER JOIN [dbo].[Abonents] AS [Extent2] ON [Extent1].AbonentID = [Extent2].ID
WHERE ([Extent2]. [ID] IS NOT NULL) AND (1 <> [Extent1]. [Hidden]) AND ([Extent1].[Status] = @p__linq__0)
強制檢查 Abonents 存在?
例如,如果我需要通過合同的號碼(不幸的是,不是唯一的,因為在DB中可能有很多具有相同號碼的合同,但被隱藏,不活躍的狀態或只是孤兒(具有該ID的abonent丟失))找到所有活動合同的電話號碼,我將使用這樣的東西
List<long> phoneNumbers = (context. Contracts.ActiveContracts().Where(c => c.No == contractNoToFind).Phone.OrderByDescending(p => p.Date).Select(p => p.Number) 。
我想說明什么是 "ActiveContract"一次,并在整個DAL中使用它
。UPD 1: 我忘了說,LINQ查詢是IQueryable的一部分,所以事實上,我在這一點上沒有選擇任何東西。另外,這就是為什么存盤查詢也不是解決方案。編輯了這個問題。對不起,給您帶來不便。
uj5u.com熱心網友回復:
由于你使用的是行內,你不需要檢查where a.ID != null,因為where a.ID == null的記錄會被自動忽略。
所以你可以制作你的where部分
where c.Hidden != true && c.Status == activeContractStatus
如果你對sql還不滿意,只要加上這個
select c.No, a.Id).ToList().Select(i=>i.No)。
我沒有看到你的課程,因為你沒有發布它們,但我想這也可能是有效的
。var contNo = context.Contracts
.Where(c=> c.AbonentId!= null && c.Hidden != true && c.Status == activeContractStatus)
.Select(c=> c.No)。
uj5u.com熱心網友回復:
看起來像EF6假設資料庫中存在一個外鍵,并在這個假設上簡化了查詢。 你可以像這樣明確地檢查:
var contNo = (
from c in db.Contracts
where db.Abonents.Where(a => a.ID == c.AbonentID).Count() == 1
&& c.Hidden != true && c.Status == activeContractStatus
select c.No).FirstOrDefault()。
EF Core似乎沒有這樣做,這是一個更好的行為,因為1)你可以有一個沒有強制外鍵的導航屬性,以及2)SQL Server(至少)將簡化查詢計劃,以消除連接,如果它只檢查相關行的存在,并且有一個 "可信的 "外鍵,強制該行的存在。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/309880.html
標籤:
