AsQueryable() 的目的是什么?

2024-03-27

目的是AsQueryable()只是为了让你可以传递一个IEnumerable到可能期望的方法IQueryable,或者有一个有用的理由来表示IEnumerable as IQueryable?例如,是否应该适用于这样的情况:

IEnumerable<Order> orders = orderRepo.GetAll();

// I don't want to create another method that works on IEnumerable,
// so I convert it here.
CountOrders(orders.AsQueryable());

public static int CountOrders(IQueryable<Order> ordersQuery)
{
    return ordersQuery.Count();
}

或者它实际上让它做了一些不同的事情:

IEnumerable<Order> orders = orderRepo.GetAll();
IQueryable<Order> ordersQuery = orders.AsQueryable();

IEnumerable<Order> filteredOrders = orders.Where(o => o.CustomerId == 3);
IQueryable<Order> filteredOrdersQuery = ordersQuery.Where(o => o.CustomerId == 3);

// Are these executed in a different way?
int result1 = filteredOrders.Count();
int result2 = filteredOrdersQuery.Count();

Do the IQueryable这些扩展方法的版本只是构建一个表达式,一旦执行,它最终会做同样的事情?我的主要问题是,使用的真正用例是什么AsQueryable?


有几个主要用途。

  1. 正如其他答案中提到的,您可以使用它来使用内存数据源模拟可查询的数据源,以便您可以更轻松地测试最终将在基于不可枚举的数据上使用的方法IQueryable.

  2. 您可以编写辅助方法来操作可应用于内存序列或外部数据源的集合。如果您编写帮助方法以使用IQueryable完全你可以使用AsQueryable在所有可枚举上使用它们。这使您可以避免编写两个单独版本的非常通用的帮助器方法。

  3. 它允许您将可查询的编译时类型更改为IQueryable,而不是一些更派生的类型。有效;你会把它用在IQueryable在您使用的同时AsEnumerable on an IEnumerable。您可能有一个实现的对象IQueryable但这也有一个例子Select方法。如果是这种情况,并且您想使用 LINQSelect方法,您需要将对象的编译时类型更改为IQueryable。你可以直接投射它,但是通过AsQueryable您可以利用类型推断的方法。如果通用参数列表很复杂,这会更方便,而且实际上必要的如果任何泛型参数是匿名类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AsQueryable() 的目的是什么? 的相关文章

随机推荐