只获取特定列

时间:2009-10-07 14:19:15

标签: 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});

但是,我收到了编译错误:

  

无法将类型'AnonymousType#1'隐式转换为'Entities.BatchRequest'

1 个答案:

答案 0 :(得分:54)

不确定。投影是这样做的:

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);
}

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