【问题标题】:LINQ to EF4 Query Where clause not filtering as expectedLINQ to EF4 Query Where 子句未按预期过滤
【发布时间】:2012-04-24 19:36:31
【问题描述】:

我已经用谷歌搜索了这个,但找不到任何明显相关的东西,所以在这里发布一些见解。使用 LINQ/EF4。这是sn-p的代码:

 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);
                }

我希望successfulJobs 包含所有 Job.Status != "Failed" 的作业。但是,当 Job.Status 等于“失败”时,会执行 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]

【问题讨论】:

  • 你能发布正在执行的SQL吗?您可以使用 SQL Server Profiler 捕获它。
  • 尝试进行不区分大小写的比较:var successfulJobs = context.Jobs.Where(x =&gt; String.Compare(x.Status, JOB_FAILED, true) != 0)
  • 按照你的建议试过了,但我仍然遇到同样的问题
  • 您是否在 SSMS 中运行了生成的 SQL 本身?它会返回什么结果?我使用您的表创建了一个快速数据库,并意识到我需要从 dbo 架构移动到 bws 架构。您是否有可能在两个模式中拥有相同的表?

标签: c# .net linq entity-framework-4


【解决方案1】:

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

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

但我不认为字符串比较在 C# 中那么挑剔

【讨论】:

    【解决方案2】:

    我仍然会说这是一个区分大小写的问题。 如果直接在 SQL 中运行查询会返回什么? 您可以在该表中发布数据样本吗? (包括“失败”状态) 我知道这不是答案,但我还不能将 cmets 添加到帖子中(代表低于 50)。

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2013-05-13
      • 1970-01-01
      相关资源
      最近更新 更多