在C#应用程序中,我有一个返回IQueryable的方法,其中MyClass是Entity Framework代码优先的类。看起来像这样。
// 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值加倍,或者应用了其他转换。 / p>
此外,我不想执行返回整个数据集的SQL查询,尤其是当我要通过ID检索单个记录时。
我可以在C#中做到吗?
答案 0 :(得分:0)
假设我想创建一个返回IQueryable的方法,但是我希望我的查询在返回数据之前对数据进行一些转换。
好的。您只需要呼叫Queryable.Select,而不是Enumerable.Select。如果传递了Func<TSource,TResult>
,它将解析为对Enumerable的调用。Select并将在应用附加表达式之前执行查询。
但是,如果您传递Expression<Func<TSource,TResult>>
,则重载将解决为Queryable.Select,并且您的查询将被修改,而新的投影将覆盖现有查询。
最正确的方法是使用LINQ。 EG:
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编写高效查询的能力,该查询将谓词通过投影推入基表。