entity-framework - 只获取特定的列

标签 entity-framework

我可以让我的 EF 对象只检索执行的 sql 中的特定列吗?如果我正在执行下面的代码来检索对象,如果需要,我可以做些什么来只获取某些列?

public IEnumerable<T> GetBy(Expression<Func<T, bool>> exp)
{
    return _ctx.CreateQuery<T>(typeof(T).Name).Where<T>(exp);
}

这将生成一个包含所有列的 select 子句。但是,如果我有一个包含大量数据的列,这确实减慢了查询速度,我如何让我的对象从生成的 sql 中排除该列?

如果我的表有 Id(int)、Status(int)、Data(blob),我怎样才能使我的查询成为
select Id, Status from TableName

代替
select Id, Status, Data from TableName

从下面的建议,我的方法是
public IEnumerable<T> GetBy(Expression<Func<T, bool>> exp, Expression<Func<T, T>> columns)
{
    return Table.Where<T>(exp).Select<T, T>(columns);
}

我这样称呼它
mgr.GetBy(f => f.Id < 10000, n => new {n.Id, n.Status});

但是,我收到一个编译错误:

Cannot implicitly convert type 'AnonymousType#1' to 'Entities.BatchRequest'

最佳答案

当然。投影是这样做的:

var q = from r in Context.TableName
        select new 
        {
            Id = r.Id,
            Status = r.Status
        }

这是一个实际示例(显然,我的数据库的表与您的不同)。我将我的 EF 模型添加到 LINQPad 并键入以下查询:
from at in AddressTypes
select new
{
    Id = at.Id,
    Code = at.Code
}

LINQPad 显示生成的 SQL 是:
SELECT 
    1 AS [C1], 
    [Extent1].[AddressTypeId] AS [AddressTypeId], 
    [Extent1].[Code] AS [Code]
FROM 
    [dbo].[AddressType] AS [Extent1]

不包括表中的任何其他字段。

回复更新的问题

您的 columns参数表示它需要一个类型 T 并返回相同的类型。因此,您传递的表达式必须符合此,否则您需要更改参数的类型,即:
public IEnumerable<U> GetBy<U>(Expression<Func<T, bool>> exp, Expression<Func<T, U>> columns)
{
    return Table.Where<T>(exp).Select<T, U>(columns);
}

现在该表达式可以返回您想使用的任何类型。

关于entity-framework - 只获取特定的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1531934/

相关文章:

c# - 数据库中的数据未更新,使用 C#、WPF、 Entity Framework 和 Visual Studio 2012

c# - Entity Framework 4 是否具有包含功能?

entity-framework - 更新 EDMX 文件时出错

c# - 是否有必要为 n 层架构上的每一层编写单元测试代码?

c# - 尝试保存实体时 ModelState.isvalid 为 false,错误表示相关实体中需要一个字段

c# - EF N 层架构

c# - ADO.NET Entity Framework 和 ASP.MVC 的组合有没有错?

c# - Fluent API HasXXX 与 WithXXX 方法

c# - EF6 CodeFirst 我的 [Key] Id 列不会像标识列那样自动递增

entity-framework - 使用 InMemoryDatabase 时如何禁用预加载