2009-09-01 57 views
1

這裏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到?

回答

1

我知道理想情況下你會使用映射中的關係,但這可能是一個很好的解決方法。

var people = dbContext.People.Where(...); 
var cities = dbContext.Cities.Where(...); 

var countryIds = 
    cities 
    .Select(c => c.CountryID) 
    .Union(people 
    .Select(p => p.CountryID) 
    .Where(cID => cID.HasValue) 
    .Select(cID => cID.Value)); 

var countries = dbContext.Countries 
    .Where(c => countryIds.Contains(c.CountryID));