【发布时间】:2014-12-16 21:40:52
【问题描述】:
通过 DataContext 使用 DB。
有这样的操作:
var flat = StavRealtyDb.TargetFlat
.Where(x => true || _some condition_).ToList();
那么,如果条件的第一部分是true,那么编译器应该跳过第二部分,对吧? 但它不会发生。如果有 .ToArray(),也会发生同样的问题。
但是,如果它最终不是 .ToList 或 .ToArray 之类的东西 - 编译器将跳过条件的第二部分。
有什么问题?正常吗? :)
更新
好的,谢谢您的回答!我明白这很正常。但问题是条件的第一部分包含: someobject == null;第二部分包含:someobject.Contains()。
.Where(x => someobject == null || someobject.Field.Contains(x.somefield))
所以当 someobject == null 时我有 ArgumentNullException(我希望第一部分将返回 true,而第二部分不会执行)。你能告诉我,我该如何解决这个问题?
P.S:实际上,.Where() 表达式更复杂:
.Where(x=> (part1 || part 2) && (part1 || part2) && ......)
【问题讨论】:
-
有什么问题?你能展示不按照你期望的方式运行的代码吗?
-
旁注:我不相信 compiler 会跳过正确的条件,即使 OR 的左侧部分对于 lambda/表达式为真(与
if(true || _some condition_)case 不同)。 -
什么没有发生?无论如何,SQL 的行为都会有所不同。
-
@AlexeiLevenkov:编译器会优化它,但不会针对表达式树。
-
@AlexeiLevenkov:是的。 tryroslyn.azurewebsites.net/…
标签: c# sql-server linq asp-classic lambda