只获得特定的列
我可以让我的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。