Entity Framework 中 Select 和 Where 的区别

66

在Entity Framework中,.Select().Where()有什么区别?

return ContextSet().Select(x=> x.FirstName == "John")

vs

ContextSet().Where(x=> x.FirstName == "John")

我应该何时使用 .Select.Where


@HenkHolterman:有时候它还是很有用的,我也写过一两次。 - SLaks
4
你正在寻找文档。 - SLaks
这是Linq:Select和Where有什么区别的重复吗? - Khan
这个回答解决了你的问题吗?Linq:Select和Where之间有什么区别 - malat
2个回答

95

Select 是一个投影操作,因此对于服务器上的 ContextSet() 中的每个元素都会计算表达式 x=> x.FirstName == "John" ,并返回许多 true/false 值(与原始列表的数量相同), select 操作将返回类似于 IEnumerable<bool> 的东西(因为 x=> x.FirstName == "John" 的类型是 bool)。

Where 操作过滤结果,返回具有原始类型的可枚举序列(不进行投影)。


因此,当您想要保留所有结果但更改其类型时(对其进行投影)使用 Select

当您想要过滤结果并保留原始类型时,请使用 Where


那么更像SQL的选择语句在哪里? - Jeremy
在LINQ和SQL中,NO、WHERE用于过滤结果,SELECT用于投影结果。 - George Duckett
1
SELECT语句控制每个结果数据行返回什么,例如您可以拥有一个名字和姓氏字段,并将select更改为fullname = firstname +“ ”+ lastname,因此您查询的数据有2个字段,但查询结果只有1个。 - George Duckett
12
是的,我明白了。我只是不知道为什么人们要使用像“投影”这样的词语,而不是使用更简单直接的短语,比如“控制返回的内容”,甚至是“允许开发者选择返回哪些列”,我甚至不知道“projection”是开发人员用语中的一部分,更别说它在这个上下文中的意思了。“pick your columns [or class properties]”则完全可以表达此意。 - Jeremy
1
@Jeremy 投影是数据库理论中的一个术语。但我同意它不像其他解释SELECT所做的那样常见。 - StayOnTarget

30

Where() 是一个筛选器。

Select() 选择不同的数据片段。
你的 Select() 示例将返回一个布尔值集合。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接