选择单行时,firstOrDefault()和select()之间有什么区别

本文关键字:之间 什么 区别 select firstOrDefault 单行时 选择 | 更新日期: 2023-09-27 18:29:55

我是Linq的新手。

我喜欢这个简单的lambda表达式:

crmContext.CallForTags.FirstOrDefault(x => x.CallForText.Contains(callAgainForText)).RowID;

它在一行中返回我想要的内容。

然而,也有类似的linq表达式:

crmContext.CallForTags.Where(x => x.CallForText.Contains(callAgainForText)).Select(x => x.RowID);

我希望这也能起到同样的作用,并将RowID 退还给我

但它实际上给了我一个错误,说:

无法将IQueryable隐式转换为int

我试着在网上搜索。但找不到类似的帖子??

有人能帮我理解吗?它有什么不同?此外,在两者之间使用是否有任何性能开销?在性能方面,哪种方法更好?

选择单行时,firstOrDefault()和select()之间有什么区别

Select返回一个IEnumerable<T>。如果只有一个元素,它将返回一个带有一个元素的IEnumerable<T>

http://msdn.microsoft.com/en-us/library/system.linq.enumerable.select.aspx

FirstOrDefault返回T.的单个实例

http://msdn.microsoft.com/en-us/library/system.linq.enumerable.firstordefault.aspx

对于第一个查询,您说"给我第一行的RowID,其中CallForText包含callAgainForText的值(如果不存在,则为类型的默认值)。"

对于第二个查询,您实际上是在说"给我CallForText包含callAgainForText值的每一行的RowID。"这将始终返回一个IEnumerable,即使它只包含一个项。

然后,您试图将此查询的结果(返回多个项目)分配给T的单个实例,当然,这是不起作用的。

这部分将为您提供完整的一行

//some IQueryable  = crmContext.CallForTags.Where(x => x.CallForText.Contains(callAgainForText));

现在,当你使用select来获得一个单列的值时,试着把它放在上面这样的int变量中,ait不会起作用,因为它会返回一个IEnumerable

Int32 test = crmContext.CallForTags.Where(x => x.CallForText.Contains(callAgainForText)).RowID;

当您使用where,然后使用column name时,它会给出一个值,或者FirstorDefault()表示整行。

FirstOrDefault返回与条件匹配的第一个元素或null。

当您使用select is返回您在lambda表达式中指定的元素的IEnumerable时,SingleOrDefault或FirstorDefault将返回实际类型,而不是它的可枚举类型。

在第一个表达式中,如果有结果,则要求只返回一个结果,并访问其RowID属性(可能是NullReferenceException),我认为它是int类型的。

在第二个表达式中,您要求根据您的条件筛选列表,然后要求检索结果中每个项目的RowID属性。我假设您想将其分配给int类型的变量,该变量需要从IQueryableint的隐式转换,因此是一个错误。

假设RowID是int,则:

crmContext.CallForTags.FirstOrDefault(x => x.CallForText.Contains(callAgainForText)).RowID

将返回一个int,即RowID。但是,如果序列为空,FirstOrDefault()将为引用类型返回null,这意味着在这种情况下,当您尝试取消引用.RowID时,它将抛出NullReferenceException。

crmContext.CallForTags.Where(x => x.CallForText.Contains(callAgainForText)).Select(x => x.RowID);

将返回与谓词CCD_ 23匹配的所有项的所有CCD_。

请注意,这是一个序列,而不是int!(我所说的"序列"是指IEnumerable<T>。)

FirstOrDefault返回与谓词匹配的第一个元素,或者为null(如果未找到匹配项)。返回类型将是int(如果谓词返回true),因为您只选择了first元素,或者如果谓词返回false,则返回null

rmContext.CallForTags.Where(x => x.CallForText.Contains(callAgainForText)).Select(x => x.RowID);

选择包含callAgainForText的所有项目并返回一个IEnumerable of integers (Which are the Row ID's) or more specifically IEnumerable<int>

相关文章: