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

本文关键字:AsQueryable 集合 我真的需要 | 更新日期: 2023-09-27 18:33:31

示例代码:

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;

这也有效并产生相同的结果,那么有什么区别呢?

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

IQueryable 对于来自远程源(如数据库(的对象是必需的/推荐的。

因为在内存集合中它是没有用的。

AsQueryable 在构造表达式树时使用。

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

现在学生正在记忆收集中。您需要根据学生 ID 触发数据库查询。

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

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

对于您的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

它必须执行表达式树的构建方式。看看这个:

AsQueryable 是一种允许将查询转换为 智商的实例。当您在 现有查询并应用进一步的转换,例如应用 过滤或指定排序顺序,这些 lambda 语句是 转换为表达式树。取决于您所在的提供商 使用,表达式树将被转换为特定于域的 语法和比执行。对于 Linq to SQL 提供程序, 表达式树将转换为 SQL 并在 SQL 服务器上执行。 但是,如果对未 实现 IQueryable 并且只实现 IEnumerable,比任何 对查询应用的转换将自动下降 回到 IEnumerable 规范。这意味着通过标记 使用 AsQueryable 查询,您可以同时获得 Linq to SQL 和 Linq 的好处 对象实现。如果现有查询碰巧实现 IQueryable,查询由Linq to SQL提供程序转换为SQL, 否则,查询将以 IL 代码的形式在内存中执行。

参考这里