這裏LINQ和可空的主要關係是aň前a mple:影響UNION操作
讓ŞaŸI H a已經3噸a統計局,國家,人民a次城市。市記錄^ h a已經a非空a BLE外鍵字段識別a國家。人們記錄^ h a已經a 空a BLE外鍵字段識別a國家 - 他們中號a y爲從a否E a船尾歐洲aň全國第a t無不復存在。
I W a NT到CRE a TE a國家的組合列表,從列表a人a次城市a名單:
var people = dbContext.People.Where(...);
var cities = dbContext.Cities.Where(...);
var countries = cities.Select(c=>c.Country);
countries = countries.Union(people.Select(p=>p.Country));
的問題來自於日a T L a第一行。由於沒有a LL人記錄^ h a已經a米a tching全國紀錄,LINQ是(正確)CRE a婷a查詢日a牛逼確保不會a行用空值填充每一個countryless人。與a調試它a PPE a RS,這是通過CRE a婷aÑENTR a虛設列c a LL 「[測試]」
SELECT [t2].[test], [t2].[CountryID], [t2].[Name]
FROM [dbo].[People] AS [t0]
LEFT OUTER JOIN (
SELECT 1 AS [test], [t1].[CountryID], [t1].[Name]
FROM [dbo].[Countries] AS [t1]
) AS [t2] ON [t2].[CountryID] = [t0].[CountryID]
雖然第a噸抽a柱[測試]被靜默去除(完成結果被標識爲a s IQuery a ble)在代碼方,在SQL方面它是絕對存在的,and當我將它與a標準聯合時導致查詢被拒絕a升選擇國家ST a tement。
在鰭a L C a本身我不W¯¯a NT或需要抽a虛擬行 - 在全PROGR a M I已經a LRE a DY包括people.Where(p=>p.CountryID != null).Select(p=>p.Country)
a一報還一a在試着p=>Country != null
。
然而,Linq不承認th a t這將防止空行and因此仍然插入測試列。 a S上的測試柱是看不見的,I H a已經沒有明顯的瓦特a y的WH a t被否則報告a小號aÑIQUERY a BLE對象「移除」它的。最終結果是運行時錯誤a回合我的UNION構造h a ving a n unequ a l列數。
如何Ça n個I強制aňINNER排除無形測試列JOIN對我的空a BLE相對a tionship,或以其他方式米a科工會工作a的I w^a NT到?