我不明白为什么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的工作方式?
答案 0 :(得分:5)
实际发生这种情况的唯一方法是,如果您在枚举parameter
时以某种方式修改parameter.Constraint
或transactions
。所以,如果你不这样做,看看你是否真的在观察你认为你正在观察的东西。
原则上,这应该可以正常工作。
编辑:你可能会对你的观察感到困惑的一个显而易见的方法是,如果你没有检查(实际评估)懒惰的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));
}
}
您必须省略重要细节。也许您可以尝试将代码减少到仍然可以再现错误的最简单的示例。这样做,您可能会发现解决方案。如果你仍然看不到问题,你可以在这里发布简短的,编译的,不工作的版本,我相信有人会很快发现问题。