首页 > 解决方案 > 如何在 C# .NET CORE 中使用特定条件自动映射?

问题描述

我想在我的特定 DTO 中自动映射一个填充 workerCategory 键,但我不知道该怎么做。构建解决方案时我没有收到任何错误,但是当我调用 API 时会触发错误。

你可以帮帮我吗?

public class WorkerRD
    {
        public int Id { get; set; }
        public string Login { get; set; }
        public string Role { get; set; }
        public string Firstname { get; set; }
        public string Lastname { get; set; }
        public string AvatarUrl { get; set; }
        public string Iso { get; set; }
        public string Sexe { get; set; }
        public string Email { get; set; }
        public string Phone { get; set; }
        public int WorkerCategoryKey { get; set; }
        public string Address { get; set; }
        public string Postcode { get; set; }
        public string Locality { get; set; }

        public IEnumerable<TrWorkerToWorkerCategory> trWorkerToWorkerCategory { get; set; }
    }

CreateMap<TUser, WorkerRD>()
                .ForMember(
                    dest => dest.Firstname,
                    opt => opt.MapFrom(src => src.TWorker.Firstname)
                ).ForMember(
                    dest => dest.Lastname,
                    opt => opt.MapFrom(src => src.TWorker.Lastname)
                ).ForMember(
                    dest => dest.Email,
                    opt => opt.MapFrom(src => src.TWorker.Email)
                ).ForMember(
                    dest => dest.Phone,
                    opt => opt.MapFrom(src => src.TWorker.Phone)
                ).ForMember(
                    dest => dest.Sexe,
                    opt => opt.MapFrom(src => src.TWorker.Sexe)
                ).ForMember(
                    dest => dest.Address,
                    opt => opt.MapFrom(src => src.TWorker.Address)
                ).ForMember(
                    dest => dest.Postcode,
                    opt => opt.MapFrom(src => src.TWorker.Postcode)
                ).ForMember(
                    dest => dest.Locality,
                    opt => opt.MapFrom(src => src.TWorker.Locality)
                ).ForMember(
                    dest => dest.WorkerCategoryKey,
                    opt => opt.MapFrom(src => src.TWorker.TrWorkerToWorkerCategory.Where(tr => tr.IsDefault == true).Select(cat => cat.WorkerCategoryKey))
                ).ForMember(
                    dest => dest.trWorkerToWorkerCategory,
                    opt => opt.MapFrom(src => src.TWorker.TrWorkerToWorkerCategory.Where(tr => tr.IsDefault == true))
                );

我的问题在这里。我想选择workerCategoryKey(整数)并将其映射到WorkerCategoryKey。但它不起作用。

.ForMember(
                    dest => dest.WorkerCategoryKey,
                    opt => opt.MapFrom(src => src.TWorker.TrWorkerToWorkerCategory.Where(tr => tr.IsDefault == true).Select(cat => cat.WorkerCategoryKey))

标签: c#.net-coreautomapperdto

解决方案


您的映射不起作用,因为您不能简单地将集合 ( .Select(cat => cat.WorkerCategoryKey)) 映射到单个值 ( dest.trWorkerToWorkerCategory)。理解这一点的一种简单方法是手动进行类似的映射:

List<int> source = new List<int> { 1, 2, 3 };
int destination = source;

这没有任何意义,但这本质上就是您要告诉 AutoMapper 对WorkerCategoryKey.

话虽如此,要准确地说出您需要做什么并不容易,因为这取决于数据。但无论它是什么,您都需要源是一个单一的int. 例如,如果源始终是相同的集合WorkerCategoryKey,那么您可以从 获取第一项.Select(cat => cat.WorkerCategoryKey)

.ForMember(
    dest => dest.WorkerCategoryKey,
    opt => opt.MapFrom(src => src.TWorker.TrWorkerToWorkerCategory.Where(tr => tr.IsDefault == true).Select(cat => cat.WorkerCategoryKey).First())

推荐阅读