我們有一個數據庫表,用於存儲一些wave文件和相關元數據的位置。表中有一個外鍵(employeeid),鏈接到員工表。然而並非所有的wav文件都與僱員有關,因爲這些記錄employeeid爲空。我們使用LinqToSQl訪問數據庫,查詢到退出時,所有非員工相關的wav文件記錄如下:有趣的LinqToSql行爲
var results = from Wavs in db.WaveFiles
where Wavs.employeeid == null;
除了這不返回任何記錄,儘管有記錄,其中僱員爲空。譜上的SQL Server我發現沒有記錄返回的原因是因爲LinqToSQl是將其轉化爲SQL,看起來非常像:
SELECT Field1, Field2 //etc
FROM WaveFiles
WHERE 1=0
顯然,這不返回行。但是,如果我進入DBML設計器並刪除關聯並保存。突然之間LINQ查詢完全相同變成
SELECT Field1, Field2 //etc
FROM WaveFiles
WHERE EmployeeID IS NULL
即:如果存在關聯,則LinqToSql將假定所有記錄都具有外鍵值(即使它可爲空,並且該屬性在WaveFile實體中顯示爲可爲空的int),並因此可構造一個將不返回記錄的where子句。
有誰知道是否有辦法保持LinqToSQL中的關聯,但停止這種行爲。我能夠迅速想到的解決方法是有一個名爲IsSystemFile的計算字段,如果employeeid爲空,則將其設置爲1,否則將其設置爲0。然而,這似乎有點破解LinqToSQl的奇怪行爲,我寧願在DBML文件中做一些事情,或者在外鍵約束上定義一些可以防止這種行爲的東西。