c# - 我可以对 IQueryable 中的每个元素应用转换并将结果作为 IQueryable 获得吗?
问题描述
在我的 C# 应用程序中,我有一个返回 IQueryable 的方法,其中 MyClass 是实体框架代码优先的类。它看起来像这样。
// Is a class for Entity Framework code-first
public class MyClass
{
public int Id {get; set;}
public int LuckyNumber {get; set;}
}
public IQueryable<MyClass> GetQuery()
{
var query = doSomethingToGetQuery();
return query;
}
假设我想创建一个返回 IQueryable 的方法,但我希望我的查询在返回之前对数据应用一些转换。
如果我有一个返回 IEnumerable 的方法,我可以这样写:
public IEnumerable<MyClass> GetEnumerable()
{
var query = doSomethingToGetQuery();
return query.Select(x =>
{
var y = x;
y.LuckyNumber = 2 * x.LuckyNumber;
return y;
}
}
因此,我将有一个 IEnumerable,它将返回与原始函数相同的数据,但它会使 LuckyNumber 加倍。
假设我想做类似的事情,但我想返回一个 IQueryable,其结果与查询原始查询的结果相同,但在结果中,LuckyNumber 值加倍,或者应用了其他一些转换。
此外,我不想执行返回整个数据集的 SQL 查询,尤其是当我按 ID 检索单个记录时。
我可以在 C# 中执行此操作吗?
解决方案
假设我想创建一个返回 IQueryable 的方法,但我希望我的查询在返回之前对数据应用一些转换。
当然。您只需要调用Queryable.Select,而不是Enumerable.Select。如果您传递 aFunc<TSource,TResult>
那么它将解析为对 Enumerable.Select 的调用,并且您的查询将在应用其他表达式之前执行。
但是,如果您传递 anExpression<Func<TSource,TResult>>
那么重载将解析为 Queryable.Select 并且您的查询将被修改,新的投影将包装现有的查询。
最简单的方法是使用 LINQ。例如:
public IQueryable<MyClass> GetEnumerable()
{
IQueryable<MyClass> query = null; //whatever
IQueryable<MyClass> q2 =
from m in query
select new MyClass()
{
LuckNumber = m.LuckNumber * 2
};
return q2;
}
请注意,如果这样做,您可能会破坏 ORM 编写高效查询的能力,该查询将谓词通过投影推送到基表。
推荐阅读
- nginx - GCP : Classic LoadBalancer,具有用于端口 80 和 443 的单个 IP
- ios - 如何将数据从 mxsegmentedpager 视图控制器传递到寻呼机视图
- html - Bootstrap 4 - 使用订单类时的选项卡订单可访问性
- r - 在R中执行2个向量的元素除法时如何控制位数
- c++ - cmake3:设置 mpi 标头的路径
- excel - VBA:如何在循环中构建嵌套字典(ByVal?)
- ruby-on-rails - Can't deploy with Capistrano - Capistrano rvm 和 bundler 的问题
- sql - 来自 vertabelo 的此模式中重复事件的 SQL 查询
- javascript - 未捕获(承诺中)类型错误:无法读取未定义的属性“过滤器”
- elasticsearch - Elasticsearch:获取字段中具有特定值的文档