ProjectTo
是 AutoMapper 库中的一个功能,它允许开发者将对象从一个类型映射到另一个类型。MapFrom
则是 AutoMapper 中用于指定如何从一个源属性映射到目标属性的方法。当需要在自动映射过程中有条件地执行 MapFrom
时,可以通过以下几种方式实现:
AutoMapper: 是一个流行的 .NET 库,用于简化对象之间的映射。它通过定义映射规则来减少重复的映射代码。
ProjectTo: 是 AutoMapper 提供的一个扩展方法,通常与 LINQ 查询一起使用,可以在查询数据库时直接进行对象的映射。
MapFrom: 是 AutoMapper 映射配置中的一个方法,用于指定源属性到目标属性的映射逻辑。
ProjectTo
可以在数据库查询时进行映射,减少了内存中的对象转换,提高了效率。以下是一个使用 ProjectTo
并有条件地执行 MapFrom
的示例:
using AutoMapper;
using System.Collections.Generic;
using System.Linq;
public class Source
{
public int Id { get; set; }
public string Name { get; set; }
public bool IsActive { get; set; }
}
public class Destination
{
public int Id { get; set; }
public string DisplayName { get; set; }
}
public class Program
{
public static void Main()
{
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Source, Destination>()
.ForMember(dest => dest.DisplayName, opt =>
{
// 有条件地执行 MapFrom
opt.MapFrom(src => src.IsActive ? src.Name : "Inactive User");
});
});
IMapper mapper = config.CreateMapper();
var sources = new List<Source>
{
new Source { Id = 1, Name = "Alice", IsActive = true },
new Source { Id = 2, Name = "Bob", IsActive = false }
};
// 使用 ProjectTo 进行映射
var destinations = sources.AsQueryable().ProjectTo<Destination>(config).ToList();
foreach (var dest in destinations)
{
Console.WriteLine($"Id: {dest.Id}, DisplayName: {dest.DisplayName}");
}
}
}
问题: 当使用 ProjectTo
时,条件映射没有按预期工作。
原因: 可能是由于 AutoMapper 的配置不正确,或者在 LINQ 查询中使用了不支持的操作。
解决方法:
ResolveUsing
或自定义解析器来处理更复杂的条件逻辑。cfg.CreateMap<Source, Destination>()
.ForMember(dest => dest.DisplayName, opt =>
{
opt.ResolveUsing(src => src.IsActive ? src.Name : "Inactive User");
});
通过上述方法,可以在 AutoMapper 的 ProjectTo
功能中有条件地执行映射逻辑,满足不同的业务需求。
领取专属 10元无门槛券
手把手带您无忧上云