这是一个奇怪的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来生成这样的命令?
答案 0 :(得分:0)
闻起来像有人可能有锁。在查询运行时,在服务器上运行sp_who2。是否存在阻止查询的内容?