【问题标题】:LINQ "Where" Statement Doesn't WorkLINQ“Where”语句不起作用
【发布时间】:2011-11-02 12:13:22
【问题描述】:

我有点困惑为什么这段代码会在一个列表中产生 2 条记录(行为适当):

var historiesToRemove = new List<WorkHistory>();
                foreach (var history in this.WorkHistories)
                {
                    if (history.Tool.Equals(item))
                    {
                        historiesToRemove.Add(history);
                    }
                }

虽然这段代码产生一个空列表:

var historiesToRemove = this.WorkHistories.Where(history => history.Tool.Equals(item)).ToList();

任何想法为什么会发生这种情况?

原因:

我没有正确实现 IDbSet 的 IQueryable 属性。这使我的 LINQ 行为错误。

【问题讨论】:

  • WorkHistory 是 IDbSet?
  • 是的。问题已解决,请阅读已接受答案的 cmets。
  • 您接受的答案已被版主删除(可能是因为质量低下)。我认为 Ben Robinson 和 tvanfosson 的答案都是正确的。 (新)选择是你的:)

标签: c# .net linq entity-framework linq-to-entities


【解决方案1】:

您在评论中提到的IDbSet 是实体框架的一部分,因此您的两段代码并不等效。 LINQ 是由 EF 转换为 SQL 的表达式树,而代码的第一位从数据库中检索整个表并在内存中执行循环。分析数据库以找出数据库中正在执行的 SQL,这应该让您了解为什么 linq 不执行您想要的操作。

【讨论】:

    【解决方案2】:

    编辑:刚刚看到您在查询末尾有ToList,因此以下内容不适用。


    阅读closures and LINQ。在您运行查询之前,“item”可能正在发生变化。

    示例问题代码:

    var filter = "Compare";
    
    var query = from m in typeof(String).GetMethods()
                where m.Name.Contains(filter)
                select new { m.Name, ParameterCount = m.GetParameters().Length };
    
    filter = "IndexOf";
    
    foreach (var item in query)
        Console.WriteLine(item);
    

    【讨论】:

    • 我不确定是不是这样,因为ToList() 调用了 lambda 执行。
    • 阅读我回答的第一行。不久前编辑过。
    【解决方案3】:

    这只是一个猜测,但我想说您提供的相等定义可能与 EF 中的 LINQ 转换所使用的定义不同。在 EF 中,我相信它使用属性相等,而您可能只检查 ID 是否相同。我建议您明确编码要在 LINQ 语句中检查的相等定义。您的等式定义在第一种情况下有效的原因是枚举 IDbSet 会将其带入内存,从而调用您的 Equals 版本,而不是 Equals 的 LINQ 到 EF 转换。

     var historiesToRemove = this.WorkHistories.Where( h => h.Tool.ID == tool.ID )
                                               .ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2011-09-16
      • 2014-11-17
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      • 2017-11-19
      相关资源
      最近更新 更多