是否可以将转换应用于IQueryable中的每个元素,并将结果作为IQueryable获得?

时间:2019-01-04 20:15:52

标签: c# entity-framework entity-framework-6 iqueryable

在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#中做到吗?

1 个答案:

答案 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编写高效查询的能力,该查询将谓词通过投影推入基表。