我真的需要在集合上使用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
。
上述就是C#学习教程:我真的需要在集合上使用AsQueryable()吗?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1004051.html