我真的需要在集合上使用AsQueryable()吗?

示例代码:

List Students = new List() { new Student(101, "Hugo", "Garcia", new List() { 91, 88, 76, 93 }), new Student(102, "Rick", "Adams", new List() { 70, 73, 66, 90 }), new Student(103, "Michael", "Tucker", new List() { 73, 80, 75, 88 }), new Student(104, "Fadi", "Fakhouri", new List() { 82, 75, 66, 84 }), new Student(105, "Peter", "Barrows", new List() { 67, 78, 70, 82 }) }; var query = from student in Students where student.Marks.AsQueryable().All(m => m > 70) select student; foreach (Student student in query) { Console.WriteLine("{0} {1}
", student.FirstName, student.LastName); }

但是,如果我将查询更改为

 var query = from student in Students where student.Marks.All(m => m > 70) select student; 

这也有效并产生相同的结果,那有什么区别?

对于来自远程源(如数据库)的对象,需要/建议使用IQueryable。

对于内存集合,它是没有用的。

在构造表达式树时使用AsQueryable 。

我能想到最合适的场景。 在您的示例中,假设您需要基于学生ID的数据库中的某些信息。

现在学生正在收集记忆。 您需要根据学生ID触发数据库查询。

  var studentList = Students.Select(s => s.Id).AsQueryAble().Select(i => remoteDBProvider.GetInfo(i)); 

studentList上的任何进一步操作都将从IQueryAble接口(查询表达式)中调用,并且将仅从数据源获取那些记录,这些记录应作为最终查询结果返回(只要数据源, remoteDBProvider.GetInfo返回值在例如,支持QueryProvider )。

它必须如何构建表达式树。 看这个:

AsQueryable是一种允许将查询转换为IQueryable实例的方法。 在现有查询上使用AsQueryable运算符并应用进一步的转换(如应用filter或指定排序顺序)时,这些lambda语句将转换为表达式树。 根据您使用的提供程序,表达式树将转换为特定于域的语法而不是执行。 对于Linq to SQL提供程序,表达式树将转换为SQL并在SQL Server上执行。 但是,如果在未实现IQueryable且仅实现IEnumerable的查询上使用AsQueryable运算符,则应用于查询的任何转换都将自动回退到IEnumerable规范。 这意味着通过使用AsQueryable标记查询,您可以获得Linq to SQL和Linq对象实现的好处。 如果您的现有查询恰好实现了IQueryable,则Linq to SQL提供程序将查询转换为SQL,否则查询将以IL代码的forms在内存中执行。

参考这里

对于List ,它没有任何区别,因为返回的IQueryable将使用相同的方法进行查询,就好像您根本没有使用过AsQueryable()

某些方法需要IQueryable参数。 我认为AsQueryable()扩展方法对于那些场景非常有用,当你需要传递一个IQueryable但只有一个IEnumerable

MSDN谈到AsQueryable

如果源类型实现IQueryable ,则AsQueryable(IEnumerable)直接返回它。 否则,它返回一个IQueryable ,它通过调用Enumerable的等效查询运算符方法而不是Queryable方法来执行查询。

这意味着在你的情况下( List没有实现IQueryable ),你真的不需要AsQueryable