实体框架选择投影委托不起作用(根据需要)
本文关键字:不起作用 选择 框架 投影 实体 | 更新日期: 2023-09-27 18:35:14
如果我这样做并使用SQL分析器分析SQL流量,则SELECT请求所有表列:
_db.Routes.Select(MakeExtentSearchProjection()).ToList();
如果我这样做,SELECT 正确包含作为投影一部分的列:
_db.Routes.Select(r => new RouteExtentSearchProjection {
GeoPathSmall = r.GeoPathSmall,
ID = r.ID,
IsPublished = r.IsPublished,
Sort = r.Sort,
Title = r.Title })
.ToList());
MakeExtentSearchProjection()
是:
private Func<Route, RouteExtentSearchProjection> MakeExtentSearchProjection()
{
return r => new RouteExtentSearchProjection()
{
ID = r.ID,
Title = r.Title,
GeoPathSmall = r.GeoPathSmall,
IsPublished = r.IsPublished
};
}
有什么区别,为什么第一个不起作用?
最大的区别在于您使用的 Select 方法的重载:
public static IQueryable<TResult> Select<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector)
或
public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
请注意,第一个对 IQueryable 对象进行操作,第二个对 IEnumerable 对象进行操作。将 IEnumerable 扩展与实体框架结合使用会导致 EF 检索所有数据,并在程序端完成投影(EF 不会创建适当的 SQL 查询)。
要解决您的问题,只需将方法定义更改为:
private Expression<Func<Route, RouteExtentSearchProjection>> MakeExtentSearchProjection()