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

C# 我真的需要在集合上使用AsQueryable()吗?,c#,.net,linq,list,asqueryable,C#,.net,Linq,List,Asqueryable,示例代码: List<Student> Students = new List<Student>() { new Student(101, "Hugo", "Garcia", new List<int>() { 91, 88, 76, 93 }), new Student(102, "Rick", "Adams", new List<int>() { 70, 73, 66, 90 }), new Stud

示例代码:

List<Student> Students = new List<Student>()   
{   
    new Student(101, "Hugo", "Garcia", new List<int>() { 91, 88, 76, 93 }),  
    new Student(102, "Rick", "Adams", new List<int>() { 70, 73, 66, 90 }),  
    new Student(103, "Michael", "Tucker", new List<int>() { 73, 80, 75, 88 }),  
    new Student(104, "Fadi", "Fakhouri", new List<int>() { 82, 75, 66, 84 }),  
    new Student(105, "Peter", "Barrows", new List<int>() { 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}<br />", student.FirstName, student.LastName);
}

这也可以工作并产生相同的结果,那么有什么区别呢?

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

AsQueryable是一种允许将查询转换为 IQueryable的实例。在上使用AsQueryable运算符时 现有查询并应用进一步的转换,例如应用 筛选或指定排序顺序时,这些lambda语句 转换为表达式树。取决于您所在的提供商 使用,表达式树将转换为特定于域的 然后执行语法和语法。在LINQtoSQL提供程序的情况下 表达式树将转换为SQL并在SQL server上执行。 但是,如果您在不支持的查询上使用AsQueryable运算符 实现IQueryable并仅实现IEnumerable,而不是任何 应用于查询的转换将自动下降 回到IEnumerable规范。这意味着通过标记 使用AsQueryable进行查询,您可以同时获得LINQtoSQL和Linq的好处 对象实现。如果您的现有查询碰巧实现了 IQueryable,查询由Linq to SQL提供程序转换为SQL, 否则,查询将以IL代码的形式在内存中执行


对于来自远程源(如数据库)的对象,需要/建议使用“参考”

对于内存中的集合,它没有任何用处

在要构造表达式树时使用

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

  var studentList = Students.Select(s => s.Id).AsQueryAble().Select(i => remoteDBProvider.GetInfo(i));
现在学生正在收集记忆。您需要根据学生ID启动数据库查询

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

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

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

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

MSDN说关于AsQueryable的内容:

如果源代码类型实现了
IQueryable
AsQueryable(IEnumerable)
直接返回它。 否则,它将返回一个执行查询的
IQueryable
调用
可枚举
中的等效查询运算符方法,而不是
中的那些可查询


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

@BorisB。这根本不是事实。也使用延迟执行。不同之处在于Queryable接受lambda作为表达式。这允许查询提供程序检查表达式并将其转换为(可能)更高效的内容,例如SQL查询。任何投影或过滤都将在数据库中进行,而不是在应用程序中,利用数据库的本机代码。但对于内存中的集合来说,这并没有什么区别。@NielsvanderRest:你说得对,注释被删除了,因为它具有误导性(或者根本不真实)。尽管如此,
AsQueryable
仍然可以用于内存收集,因为它的
Select
扩展方法接受一个
表达式,允许您分析或修改它。我可以想到的一个场景是使用封装在
IQueryable
中的内存集合作为一种方式,让不知道持久性的层将查询作为AST发送到知道持久性的层