gpt4 book ai didi

c# - AsQueryable() 的目的是什么?

转载 作者:IT王子 更新时间:2023-10-29 03:37:11 25 4
gpt4 key购买 nike

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 的真正用例是什么?

最佳答案

有几个主要用途。

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

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

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

关于c# - AsQueryable() 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17366907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com