繁体   English   中英

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

[英]Do i really need use AsQueryable() on collection?

示例代码:

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);
}

但是如果我将查询更改为

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 运算符并应用进一步的转换(例如应用过滤器或指定排序顺序)时,这些 lambda 语句将转换为表达式树。 根据您使用的提供程序,表达式树将转换为特定于域的语法并执行。 在 Linq to SQL 提供程序的情况下,表达式树将转换为 SQL 并在 SQL 服务器上执行。 但是,如果您在未实现 IQueryable 且仅实现 IEnumerable 的查询上使用 AsQueryable 运算符,则您对查询应用的任何转换都将自动回退到 IEnumerable 规范。 这意味着通过使用 AsQueryable 标记查询,您可以获得 Linq to SQL 和 Linq to object 实现的好处。 如果您现有的查询恰好实现了 IQueryable,则该查询会被 Linq to SQL 提供程序转换为 SQL,否则该查询将以 IL 代码的形式在内存中执行。

参考这里

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

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

MSDN 说AsQueryable

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM