【问题标题】:Mapping separate fields into one string using Automapper使用 Automapper 将单独的字段映射到一个字符串
【发布时间】:2015-08-18 18:06:42
【问题描述】:

我花了几天时间试图找到这个,但没有任何运气。

我有一个地址表。每行有 4 个地址字段。我想将它们映射到另一个对象,该对象具有一个字段,该字段是由 4 个字段组成的单个字符串,但是(总是有一个但是),如果其中一个字段包含 null 或空字符串,我想忽略它。

例如 地址表包含:- 地址 1 = 门牌号 地址 2 = 街道 地址3 = 地址4 = 城镇

新对象将包含字符串:- 门牌号,街道,城镇。

根据要求,这是我所在的位置:-

AutoMapper 配置文件

public static class AutoMapperConfig
{
    public static void Configure()
    {
        Mapper.Initialize(cfg =>
        {
            cfg.AddProfile(new AddressSearchList_ToResponse_Profile());
        });
    }
}

配置文件定义:

    public class AddressSearchList_ToResponse_Profile : Profile
{
    protected override void Configure()
    {
        Mapper.CreateMap<Address, AddressSearchResponseDto>()
            .ConvertUsing<ConvertAddressToSearchList>();

        Mapper.AssertConfigurationIsValid();

        //This is as far as I get - what am I missing

    }
}

最后是转换例程(诚然不是有史以来最流畅的代码):

public class ConvertAddressToSearchList : ITypeConverter<Address, AddressSearchResponseDto>
{

    public AddressSearchResponseDto Convert(ResolutionContext context)
    {

        string newAddress = string.Empty;
        Address oldAddress = (Address)context.SourceValue;
        int addressId = oldAddress.Id;

        newAddress = oldAddress.AddressLine1;

        if (!String.IsNullOrEmpty(oldAddress.AddressLine2))
        {
            newAddress += ", " + oldAddress.AddressLine2;
        }

        if (!String.IsNullOrEmpty(oldAddress.AddressLine3))
        {
            newAddress += ", " + oldAddress.AddressLine3;
        }

        if (!String.IsNullOrEmpty(oldAddress.AddressLine4))
        {
            newAddress += ", " + oldAddress.AddressLine4;
        }

        if (!String.IsNullOrEmpty(oldAddress.County))
        {
            newAddress += ", " + oldAddress.County;
        }

        if (!String.IsNullOrEmpty(oldAddress.Postcode))
        {
            newAddress += ".  " + oldAddress.Postcode;
        }


        AddressSearchResponseDto searchAddress = new AddressSearchResponseDto { Id = addressId, Address = newAddress };

        return searchAddress;

    }

谢谢

史蒂夫

【问题讨论】:

  • 请提供任何代码示例
  • 感谢您的快速回复。我已经用代码更新了问题

标签: c# string field concatenation automapper


【解决方案1】:

也许,这只是我,但是(总是有一个但是),有什么问题?

我认为它已经转换了,您只是缺少实际映射源实体并显示结果以进行监控的代码,如下所示:

AddressSearchResponseDto result = Mapper.Map<Address,AddressSearchResponseDto>(source); 
Console.WriteLine(result.newAddress); 

【讨论】:

  • 我如何从对象 1 中获取四个单独的字段并使用 automapper 将它们变成一个字段,忽略任何为空或为空的字段>
  • 但是,你已经在使用一个了。你的代码没有错误,对吧?
  • 代码没有错误——它只是返回一个空地址。我知道它与这个 ITypeConverter 有关。我不知道如何让它启动并给我我想要的数据
  • 我认为它已经转换了,你只是错过了看到这样结果的代码: AddressSearchResponseDto result = Mapper.Map
    (source); Console.WriteLine(result.newAddress);
  • 谢谢你——你把我推向了正确的方向。答案在下一篇文章中:)
【解决方案2】:

要解决此问题,请将配置文件定义更改为:

public class AddressSearchList_ToResponse_Profile : Profile
{
    protected override void Configure()
    {
        Mapper.CreateMap<Address, AddressSearchResponseDto>()
            .ConvertUsing<ConvertAddressToSearchList>();

    }
}

然后在调用 automapper gubbins 的代码中你需要这样做:

var query = from a in addressRepository.GetAll() select a;

IList<AddressSearchResponseDto> result = Mapper.Map<IList<Address>, IList<AddressSearchResponseDto>>(query.ToList());

结果现在包含正确的数据。

非常感谢你们的帮助。

【讨论】:

    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 2014-10-06
    • 1970-01-01
    • 2014-10-28
    相关资源
    最近更新 更多