我们有一个数据库表,用于存储一些wave文件以及相关元数据的位置。该表上有一个外键(employeeid)链接到employee表。但是,并非所有的wav文件都与雇员相关,因为这些记录的雇员id为null。我们正在使用LinqToSQl访问数据库,查询将提取所有与员工无关的wav文件记录,如下所示:

var results = from Wavs in db.WaveFiles
              where Wavs.employeeid == null;


除非有记录,其中employeeid为null,否则此操作不会返回任何记录。在分析sql服务器时,我发现未返回任何记录的原因是因为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实体上显示为可为null的int),因此,可构造一个where子句,该子句将不返回任何记录。

有谁知道是否有一种方法可以将关联保留在LinqToSQL中,但可以停止这种行为。我很快想到的解决方法是,拥有一个名为IsSystemFile的计算字段,如果employeeid为null,则将其设置为1,否则将其设置为0。但是,要解决LinqToSQl的奇怪行为,这似乎有点技巧,我宁愿在DBML文件中执行某些操作,也可以在外键约束上定义某些操作来防止此行为。

最佳答案

我认为您应该仔细检查dbml文件。听起来好像Linq不知道employeeid是可为空的列。或查看您的.cs文件。该列的属性应如下所示:

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


并不是:

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

07-27 13:48