2010-06-01 53 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一个不错的是引入拖欠员工其中每个波形文件都关联到,而不是与真正的员工关联