实体框架选择投影委托不起作用(根据需要)

本文关键字:不起作用 选择 框架 投影 实体 | 更新日期: 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()