Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自动映射从列表到对象的复杂映射_C#_.net_Automapper - Fatal编程技术网

C# 自动映射从列表到对象的复杂映射

C# 自动映射从列表到对象的复杂映射,c#,.net,automapper,C#,.net,Automapper,我的对象结构如下 public class Source { public Connection Connection { get; set;} } public class Connection { public string Id { get; set; public IEnumerable<Distributor> Distributors { get; set; } public class Distributor { get; set; } {

我的对象结构如下

public class Source
{
    public Connection Connection { get; set;}
}

public class Connection
{
    public string Id { get; set;
    public IEnumerable<Distributor> Distributors { get; set;
}

public class Distributor { get; set; }
{
    public DistributorType Type {get; set;}
    public  string X { get; set; }
    public string Y { get; set; }
}

public class Destination
{
     public Distribution Distribution { get; set;
}

public class Distribution
{
    public string Id { get; set;}
    public  string X { get; set; }
    public string Y { get; set; }
}
我尝试过使用自定义解析器,但没有成功

public class CustomDistributorResolver : IValueResolver<Source, Destination, Distribution >
    {
        public Distribution  Resolve(Source source, Destination destination, Distribution destMember, ResolutionContext context)
        {
            var result = source.Connection.Distributors.FirstOrDefault(x => x.DistributorType =="ABC");
            if (result == null) return null;

            return new Distribution 
            {
                Id                      = source.Connection?.Id,
                X                       = result.X,
                Y                       = result.Y
            };
        }
    }
公共类CustomDistributorResolver:IValueResolver
{
公共分发解析(源、目标、分发目标成员、ResolutionContext上下文)
{
var result=source.Connection.Distributors.FirstOrDefault(x=>x.DistributorType==“ABC”);
if(result==null)返回null;
返回新发行版
{
Id=源.Connection?.Id,
X=结果.X,
Y=结果。Y
};
}
}
映射Pofile
CreateMap()
.ForMember(d=>d.Distribution,opt=>opt.MapFrom(新的CustomDistributorResolver());
我总是将分布值设置为NULL

我不确定我在地图上做错了什么


-艾伦-

我不太确定你将如何处理这个数字。所以我用linq来接近

var id = Source.Connection.Id;
var distributions = Source.Connection.Distributors.Select(m=> new Distribution()
                    {
                            Id = id,
                            X = m.X,
                            Y = m.Y,
                    });
Automapper希望:

CreateMap<Source, Destination>()
    .ForMember(dest => dest.Distribution.Id ,opt => opt.MapFrom(src => src.Connection.Id))
    .ForMember(dest => dest.Distribution.X,  opt => opt.MapFrom(src => src.Connection.Distributors.FirstOrDefault().X))
    .ForMember(dest => dest.Distribution.Y,  opt => opt.MapFrom(src => src.Connection.Distributors.FirstOrDefault().Y));
CreateMap()
.ForMember(dest=>dest.Distribution.Id,opt=>opt.MapFrom(src=>src.Connection.Id))
.FormMember(dest=>dest.Distribution.X,opt=>opt.MapFrom(src=>src.Connection.Distributors.FirstOrDefault().X))
.FormMember(dest=>dest.Distribution.Y,opt=>opt.MapFrom(src=>src.Connection.Distributors.FirstOrDefault().Y));

您可以使用类型转换器

private class DestinationConverter : ITypeConverter<Source, Destination>
{
    public Destination Convert(Source source,
    Destination destination,

    ResolutionContext context)
    {
        var result = source.Connection.Distributors.FirstOrDefault(x => x.Type == "ABC");

        if (result == null) return null;
        destination = new Destination();

        destination.Distribution = new Distribution
        {
            Id = source.Connection?.Id,
            X = result.X,
            Y = result.Y
        };

        return destination;
    }
}
CreateMap<Source, Destination>().ConvertUsing<DestinationConverter>();
专用类DestinationConverter:ITypeConverter
{
公共目标转换(源、源、,
目的地,
决议(上下文)
{
var result=source.Connection.Distributors.FirstOrDefault(x=>x.Type==“ABC”);
if(result==null)返回null;
目的地=新目的地();
destination.Distribution=新分发
{
Id=源.Connection?.Id,
X=结果.X,
Y=结果。Y
};
返回目的地;
}
}
并注册转换器

private class DestinationConverter : ITypeConverter<Source, Destination>
{
    public Destination Convert(Source source,
    Destination destination,

    ResolutionContext context)
    {
        var result = source.Connection.Distributors.FirstOrDefault(x => x.Type == "ABC");

        if (result == null) return null;
        destination = new Destination();

        destination.Distribution = new Distribution
        {
            Id = source.Connection?.Id,
            X = result.X,
            Y = result.Y
        };

        return destination;
    }
}
CreateMap<Source, Destination>().ConvertUsing<DestinationConverter>();
CreateMap().ConvertUsing();

我现在不在我的windows PC附近,但我有一些类似的东西,我认为这是由于EF core中的延迟加载设置。可能值得检查一下。
ForMember(d=>d.Distribution,o=>o.MapFrom(s=>s.Connection.Distributors.FirstOrDefault(x=>x.DistributorType==“ABC”))
我知道这是手动映射,但我认为这是本案例的唯一可能解决方案,因为第一个默认研究。作者提到CustomDistributorResolver,所以我尝试了另一种映射的可能解决方案。不,不是。正如我上面所评论的,您可以将该查询放在
映射中,并可能通过e
Id
上下文中。项目
。对不起,再来一次-:)。分发中的属性Id为source.Connection?.Id。您的解决方案Id未映射,因为分发服务器中不存在。结果是X和Y来自一个类(分发服务器),ID来自另一个类(连接)。我已经讨论过了。另一个选项是从
源.Connection
映射。