之间有什么不同
public static IEnumerable<TSource> Where<TSource>
(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
和
public static IQueryable<TSource> Where<TSource>
(this IQueryable<TSource> source,
Expression<Func<TSource, bool>> predicate)
两种方法都可以以相同的方式接受lambda表达式。
List<string> fruits =
new List<string> { "apple", "passionfruit", "banana", "mango",
"orange", "blueberry", "grape", "strawberry" };
IEnumerable<string> query = fruits.Where(fruit => fruit.Length < 6);
为什么委托函数的委托功能和表达存在?我必须要小心吗?
答案 0 :(得分:5)
IEnumerable
只是一系列C#项目。 IEnumerable
版本的Select
字面上只是在C#中通过输入IEnumerable
中的项进行迭代,根据委托函数对它们进行测试,并生成那些匹配的项。
然而,IQueryable
可代表例如SQL表中的项目。 (或许多其他类型的数据源,但SQL可能是最常见的。)IQueryable
Select
版本的IEnumerable
可以将表达式转换为SQL查询(或类似的)的一部分,并传递负担决定返回SQL服务器(或类似)的项目。
你真的不必担心这个区别 - LINQ可以为你隐藏所有这些细节。如果您要查询C#对象列表,它将使用IQueryable
版本;如果您通过Linq-to-SQL查询SQL,它将使用{{1}}版本。
答案 1 :(得分:4)
一个适用于IEnumerable<T>
,另一个适用于IQueryable<T>
。
答案 2 :(得分:2)
当你有IQueryable<T>
最终使用的数据源(SqlServer或其他)时,尚未查询,并且生成的sql仍然可以被其他条件修改。
当您有IEnumerable<T>
时,可能的查询已实现,您只会过滤该集合。
答案 3 :(得分:2)
O.R。 Mapper的答案是最充足和最简单的。我认为你需要检查的是你可以找到difference between IEnumerable and IQueryable here的内容。