我目前正在将AutoMapper与显式映射的字段一起使用,并且还可能与LINQ结合到实体进行分页。我感兴趣的代码部分如下:
var result = page.ApplyPaging(query)
.AsQueryable()
.Project()
.To<TDto>(null, membersToMap)
.ToList();
分页通过以下方式完成:
public IEnumerable<T> ApplyPaging<T>(IEnumerable<T> source)
{
if (!PagingEnabled)
{
return source;
}
var skippedEntries = (PageNumber.GetValueOrDefault(1) - 1) * PageSize;
var result = source.Skip(skippedEntries).Take(PageSize);
return result;
}
现在有趣的是:通过此实现,将忽略MembersToMap Array,并且AutoMapper联接所有导航表,从而破坏了巨大的SQL查询。我不明白的地方:如果我将分页更改为:
public IQueryable<T> ApplyPaging2<T>(IQueryable<T> source)
{
if (!PagingEnabled)
{
return source;
}
var skippedEntries = (PageNumber.GetValueOrDefault(1) - 1) * PageSize;
var result = source.Skip(skippedEntries).Take(PageSize);
return result;
}
并删除.AsQueryable,AutoMapper只会获取所需的表。可能我错过了一个关键的难题,但是据我所知,如果基础列表已经是IQueryable,则通过AsQueryable更改编译时类型不应更改任何行为。 因此,这是AutoMapper问题还是我错过了使用从IQueryable转换为IEnumerable并返回的可能性?