具有Binary = null的LINQ-to-SQL Enumerable表达式失败

时间:2009-09-02 00:28:18

标签: c# sql linq-to-sql null

这是一个奇怪的LINQ-to-SQL问题,无法评估为Enumerable(在SQL中),但我可以评估客户端。我认为这与我测试二进制属性为'null'有关。

我需要确定我的Job何时完成,这意味着该Job中的所有文件在其二进制FileContents属性中至少有一些数据。该过程是查找给定JobId的所有文件,如果其中任何文件具有FileContents = null,则作业尚未完成。如果所有文件都有一些FileContents,那么Job就完成了。

第一次尝试:

bool isJobComplete = !context.Files.Any
    (f => f.JobId == this.JobId && f.FileContents == null);

不起作用!我收到一个SQL超时异常。我也尝试了同一件事的其他变化,并收到相同的结果,例如

var filesInJob = context.Files.Where(f => f.JobId == this.JobId);
bool isJobComplete = !filesInJob.Any(jf => jf.FileContents == null);

解决方法是检索所有文件的列表,然后检查FileContents客户端。这远非理想,因为有时我会在作业中有很多大文件。

List<File> filesInJob = context.Files.Where(f => f.JobId == this.JobId).ToList();
bool isJobComplete = !filesInJob.Any(jf => jf.FileContents == null);

在非工作表达式上生成的SQL:

SELECT
    <CASE
        WHEN EXISTS<
            SELECT NULL AS [EMPTY]
            FROM [dbo].[File] as [t0]
            WHERE <[t0].[JobId] = @p)> AND <[t0].[FileContents] IS NULL>
            > THEN 1
        ELSE 0
    END> AS [value1]

有没有人有这方面的经验,或者解释为什么LINQ不能与SQL说空?

编辑:

运行SELECT TOP 1 * FROM [File] WHERE [FileContents] IS NULL也会给出超时。这是SQL无法搜索二进制类型字段的问题吗?如果是这样,是否有一个SQL命令可以使用这个场景,我们如何操作LINQ-to-SQL来生成这样的命令?

1 个答案:

答案 0 :(得分:0)

闻起来像有人可能有锁。在查询运行时,在服务器上运行sp_who2。是否存在阻止查询的内容?