2

我是 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

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

任何人都可以帮助我理解,它有什么不同?在两者之间使用是否有任何性能开销?哪一种在性能方面更好?

4

6 回答 6

3

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

CallForText在您的第一个查询中,您是在说“给我包含值的第一行的 RowID callAgainForText(或者如果不存在,则为该类型的默认值)。”

在您的第二个查询中,您实际上是在说“给我CallForText包含 的值的每一行的 RowID callAgainForText”。即使它只包含一个项目,这也总是会给你一个。IEnumerable

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

于 2013-09-03T07:35:01.003 回答
1

这部分会给你一个完整的行

//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;

当您使用wherethencolumn name时,它会给出一个值,或者FirstorDefault()是完整的行。

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

于 2013-09-03T07:35:56.950 回答
0

在第一个表达式中,您要求仅返回一个结果(如果有的话)并访问它的RowID属性(可能NullReferenceException在那里),我假设它是int类型的。

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

于 2013-09-03T07:35:54.433 回答
0

假设这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);

RowID将返回与谓词匹配的所有项目的所有值的序列x.CallForText.Contains(callAgainForText)

请注意,这是一个序列,而不是一个整数!(我的意思是“序列” IEnumerable<T>。)

于 2013-09-03T07:36:10.717 回答
0

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

于 2013-09-03T07:34:35.187 回答
0

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

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>

于 2013-09-03T07:36:24.817 回答