这样做的目的AsQueryable()
仅仅是为了让您可以传递IEnumerable
可能期望的方法IQueryable
,还是有一个有用的理由来表示IEnumerable
为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();
IQueryable
这些扩展方法的版本是否只是构建了一个表达式,该表达式一旦执行便会完成相同的工作?我的主要问题是,什么是真正的用例AsQueryable
?
有一些主要用途。
如其他答案中所述,您可以使用它来模拟内存数据源中的可查询数据源,以便更轻松地测试最终将在不可枚举的基础上使用的方法IQueryable
。
您可以编写用于处理可应用于内存序列或外部数据源的集合的辅助方法。如果编写帮助方法以IQueryable
完全使用AsQueryable
,则可以在所有枚举数上使用它们。这样可以避免编写非常通用的辅助方法的两个单独的版本。
它允许您将可查询对象的编译时类型更改为IQueryable
,而不是其他更多派生类型。有效; 你会用它上IQueryable
在相同的时间,你会使用AsEnumerable
上IEnumerable
。您可能有一个实现的对象,IQueryable
但也有一个实例Select
方法。如果是这种情况,并且您想使用LINQSelect
方法,则需要将对象的编译时间类型更改为IQueryable
。您可以只进行转换,但是通过使用一种AsQueryable
方法,您可以利用类型推断的优势。如果通用参数列表很复杂,这将更加方便,而如果任何通用参数是匿名类型,则实际上很有必要。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句