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发送到知道持久性的层