LINQ - 不同的语法风格,不同的结果?

时间:2011-12-15 04:53:38

标签: c# linq

有人可以告诉我以下两个LINQ语句的区别吗?

var ChkUnique = DB.BusinessFile.FirstOrDefault(c => c.ROCNo == txtBoxID.Text);

var ChkUnique = from c in DB.BusinessFile 
                where c.ROCNo == (string)txtBoxID.Text 
                select c;
如果无法找到匹配项,

ChkUnique != null会返回前一位false,后者会返回true,我无法弄清楚为什么会发生这种情况。

我是LINQ的新手,所以我可能错过了一些非常基本的内容,但此刻让我感到疯狂。

2 个答案:

答案 0 :(得分:10)

第二个代码返回一个表示您正在调用的查询的对象;它永远不会是空的。虽然一旦枚举,它可能是一个空集合。 (但仍然不是空的)

您的第一个是调用FirstOrDefault,它将单个结果强制转换为单个变量,如果没有结果则返回null。如果您使用Where代替FirstOrDefault,则两次都会得到相同的结果。

答案 1 :(得分:1)

第一个语句使用Extension Method,第二个语句是LINQ Query Expression

在第一个方法FirstOrDefault中,返回序列的第一个元素,如果序列不包含元素,则返回默认值。在这里,您正在处理对象,因此如果您的结果不包含任何元素,则默认返回为NULL

另一方面,你的第二个语句总是返回IEnumerable<T>集合类型值,它永远不会为空。只是你可以使用Collection的Count属性检查集合是否包含项目。

如果在第一个语句中使用扩展方法.Where(),那么它将等同于第二个语句。

检查指定的链接以获取详细信息和差异。