2012-04-24 132 views
1

我已经为此搜索了,但找不到任何明显相关的东西,所以在这里张贴一些见解。使用LINQ/EF4。这里是代码片段:LINQ到EF4查询Where子句没有按预期过滤

private const string JOB_FAILED = "Failed"; 
// other code.. 

var successfulJobs = context.Jobs.Where(x => x.Status != JOB_FAILED); 
       foreach (Job successfulJob in successfulJobs) 
       { 
        context.DeleteObject(successfulJob); 
       } 

我期望成功的作业包含所有Job.Status!=“失败”的作业。但是,当Job.Status等于“失败”时,代码witihn foreach {}会执行。我在这里错过了关于LINQ \ Lambda的基本知识吗?

编辑:生成的SQL按要求,似乎没问题。

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[Parameters] AS [Parameters], 
[Extent1].[Status] AS [Status], 
[Extent1].[Created] AS [Created], 
[Extent1].[Modified] AS [Modified] 
FROM [bws].[JobRunner_Tasks] AS [Extent1] 
WHERE N'Failed' <> [Extent1].[Status] 
+1

你可以发布正在执行的SQL吗?您可以使用SQL Server Profiler捕获该数据。 – usr 2012-04-24 19:48:15

+0

尝试进行不区分大小写的比较:'var successfulJobs = context.Jobs.Where(x => String.Compare(x.Status,JOB_FAILED,true)!= 0)' – sarghir 2012-04-24 20:09:38

+0

按照您的建议尝试,但我仍然得到同样的问题 – 2012-04-24 21:56:26

回答

0

hmmmm ....任何其他语言,我可能会建议使用

x => !x.Status.equals(JOB_FAILED) 

,但我没想到的字符串比较是挑剔的C#

0

我还是会说这是区分大小写的问题。 查询如果直接在SQL中运行,它会返回什么结果? 你可以发表一张该表中的数据样本吗? (包括“失败”状态) 我知道这不是一个答案,但我不能添加评论的职位呢(代表50以下)。