2010-06-01 57 views
3

我們有一個數據庫表,用於存儲一些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文件中做一些事情,或者在外鍵約束上定義一些可以防止這種行爲的東西。

回答

0

該列是定義d爲:

[Column(Storage="_employeeid", DbType="Int")] 

離開該關聯的方法是從員工實體集合中進行左連接。

5

我想你應該仔細檢查你的dbml文件。聽起來像Linq不知道employeeid是一個空列。或者看看你的.cs文件。此列的屬性應該是這樣的:

[Column(Storage="_employeeid", DbType="Int")] 

,而不是:

[Column(Storage="_employeeid", DbType="Int NOT NULL")] 
0

試試這個:

var results = from Wavs in db.WaveFiles 
       where DbNull.Value.Equals(Wavs.employeeid) 

另一種方式和良好的practe一個不錯的是引入拖欠員工其中每個波形文件都關聯到,而不是與真正的員工關聯