只获得特定的列

我可以让我的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 

从下面的build议,我的方法是

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

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

不能隐式地将types“AnonymousType#1”转换为“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参数说明它需要一个typesT并返回相同的types。 因此,你传递的expression式必须符合这个,否则你需要改变参数的types,即:

 public IEnumerable<U> GetBy<U>(Expression<Func<T, bool>> exp, Expression<Func<T, U>> columns) { return Table.Where<T>(exp).Select<T, U>(columns); } 

现在expression式可以返回任何你喜欢使用的types。