奇怪.Where()行为。有人有解释吗?

时间:2009-11-24 21:26:55

标签: c# linq entity-framework where

原始

我不明白为什么Where()子句在最后一个例子中没有给我正确的结果 这没有什么不同吗?为什么C#表现不同?

transactions = IEnumerable<Transaction> //pseudocode 

//This works: It gives me the transaction I need.
DateTime startDate = DateTime.Parse(parameter.Constraint); 
transactions = transactions.Where(T => T.date >= startDate);  

//This doesn't work... No actual code changed, only the way of writing it...
//I get 0 results.
 transactions = transactions.Where(T => T.date >= DateTime.Parse(parameter.Constraint));

修改

好的,确实有必要提到使用Entity Framework加载事务。

transactions = this.db.Include("blablabla").OrderByDescending(T => T.date);

也许这就是为什么它做得很奇怪?由于实体Linq的工作方式?

3 个答案:

答案 0 :(得分:5)

实际发生这种情况的唯一方法是,如果您在枚举parameter时以某种方式修改parameter.Constrainttransactions。所以,如果你不这样做,看看你是否真的在观察你认为你正在观察的东西。

原则上,这应该可以正常工作。

编辑:你可能会对你的观察感到困惑的一个显而易见的方法是,如果你没有检查(实际评估)懒惰的Where枚举的结果,直到后来parameter发生了变化。如果您在结尾处放置一个ToArray来立即对其进行评估,您可能会发现它“神奇地”修复了自己。

答案 1 :(得分:4)

答案 2 :(得分:1)

我刚试过这个并且工作正常:

class Program
{
    public class Transaction { public DateTime date { get; set; } }
    public class Parameter { public string Constraint { get; set; } }
    public static void Main()
    {
        IEnumerable<Transaction> transactions = new List<Transaction> {
            new Transaction { date = new DateTime(2009, 10, 5) },
            new Transaction { date = new DateTime(2009, 11, 3) }
        };
        Parameter parameter = new Parameter { Constraint = "2009-11-01" };
        DateTime startDate = DateTime.Parse(parameter.Constraint);

        // Version 1.
        transactions = transactions.Where(T => T.date >= startDate);

        // Version 2.
        transactions = transactions.Where(T => T.date >= DateTime.Parse(parameter.Constraint));

    }
}

您必须省略重要细节。也许您可以尝试将代码减少到仍然可以再现错误的最简单的示例。这样做,您可能会发现解决方案。如果你仍然看不到问题,你可以在这里发布简短的,编译的,不工作的版本,我相信有人会很快发现问题。