1

这 2 个查询在功能上是否等效?

1)

var z=Categories
         .Where(s=>s.CategoryName.Contains("a"))
         .OrderBy(s => s.CategoryName).AsEnumerable()
         .Select((x,i)=>new {x.CategoryName,Rank=i});

2)

var z=Categories.AsEnumerable()
         .Where(s=>s.CategoryName.Contains("a"))
         .OrderBy(s => s.CategoryName)
         .Select((x,i)=>new {x.CategoryName,Rank=i});

我的意思是,查询中“AsNumerable()”的顺序是否会改变从客户端检索到的数据项的数量,或者它们的检索方式?

谢谢你的帮助。

4

2 回答 2

4

这 2 个查询在功能上是否等效?

如果等效地表示最终结果,那么可能是的(取决于提供者如何实现这些操作),区别在于您使用内存扩展的第二个查询。

我的意思是,查询中“AsNumerable()”的顺序是否会改变从客户端检索到的数据项的数量,或者它们的检索方式?

是的,在第一个查询中,WhereOrderBy被翻译成SQLSelect在内存中执行。

在您的第二个查询中,数据库中的所有信息都被带到内存中,然后在内存中进行过滤和转换。


Categories可能是IQueryable,因此您将在Queryable课堂上使用扩展。这个版本的扩展接收一个Expressionas 参数,这些表达式树允许将您的代码转换为 sql 查询。

AsEnumerable()将对象返回为IEnumerable,因此您将使用Enumerable直接在内存中执行的类中的扩展。

于 2016-04-26T18:15:11.293 回答
1

是的,他们做同样的事情,但方式不同。第一个查询执行 SQL 数据库本身中的所有选择、排序和条件。

然而,第二个代码段从数据库中获取所有行并将其存储在内存中。然后在它对获取的数据进行排序、排序和应用条件之后,即现在在内存中。

AsEnumerable() 将查询分为两部分:

  1. Inside-Part(AsEnumerable 之前的查询)作为 LINQ-to-SQL 执行
  2. 外部部分(AsEnumerable 之后的查询)作为 LINQ-to-Objects 执行
于 2017-08-03T10:10:33.047 回答