【发布时间】:2010-10-20 19:28:59
【问题描述】:
我正在使用 linq 筛选消息项的选择。我编写的方法接受一堆可能为空的参数。如果它们为空,则应忽略文件的标准。如果不为null,则使用它来过滤结果。
据我了解,在执行 || 时操作是 C#,如果第一个表达式为真,则不应计算第二个表达式。
例如
if(ExpressionOne() || ExpressionTwo())
{
// only ExpressionOne was evaluated because it was true
}
现在,在 linq 中,我正在尝试这个:
var messages = (from msg in dc.MessageItems
where String.IsNullOrEmpty(fromname) || (!String.IsNullOrEmpty(fromname) && msg.FromName.ToLower().Contains(fromname.ToLower()))
select msg);
我会认为这是正确的,因为String.IsNullOrEmpty(fromname) 等于 true 并且 || 的第二部分不会跑。
但它确实会运行,第二部分
msg.FromName.ToLower().Contains(fromname.ToLower()))
抛出空引用异常(因为fromname 为空)!! - 我得到一个经典的“对象引用未设置为对象的实例”异常。
有什么帮助吗?
【问题讨论】:
-
了解此 LINQ to Objects 是否很重要? LINQ到SQL? LINQ 到实体?等等...你的假设 || will 快捷方式仅在 LINQ to Objects 中得到保证,因为您的代码未翻译(例如,T-SQL)。
-
啊酷。好的卢卡斯,所以我正在使用 Linq to SQL。我想你真的知道我在这里的意思。所以你在 Linq to SQL 中说你不会指望这会起作用?我应该如何在 Linq to SQL 中解决这个问题?我只想说:如果传递的参数为null,那么无论匹配到哪个都获取记录,如果不为null,则确保返回的每条记录都与传递的参数匹配。非常感谢!
-
Ev,如果这是 linq to sql,那么短路评估只是 不是你可以依赖的东西句号
-
好吧,这很酷@ShuggyCoUk。我非常感谢您的意见!你明白我在这里想要做什么吗?听起来我完全错过了一些东西!我知道这可以在 SQL 中工作,而且我知道它可以在 C# 中工作,所以在 Linq to SQL 中必须有某种等价物。我对吗?所以,我想说的是,在这个特定的 where 子句中,如果参数 fromname 为空,要么获取所有行。如果 fromname 不是 NULL,请确保我们匹配参数。抓住我?再次感谢您的帮助伙伴
-
您没有使用 LINQ to SQL,因为 (1) 方法 'Boolean IsNullOrEmpty(System.String)' 不支持对 SQL 的转换,并且 (2) 您不会收到 NullReferenceException(它会只发生在客户端,不在数据库上)。
标签: c# .net linq linq-to-sql null