AutoMapper-string.Join导致从char到string的映射丢失

时间:2018-07-06 16:43:02

标签: c# entity-framework automapper breeze

我有一个DTO,我希望在FirstName属性中返回一个以逗号分隔的字符串“ xxx,ddd,ccc”。我将属性设置为ICollection,因为如果我仅使用字符串声明,则会出现以下错误:

错误:LINQ to Entities无法识别方法'System.String Join(System.String,System.Collections.Generic.IEnumerable`1 [System.String])'方法,并且该方法无法转换为商店表达。

//DTO
public class fooGridViewModel
{
   public virtual ICollection<string> FirstName { get; set; }
}


//Auto Mapper Initialize / Config
cfg.CreateMap<fooSource, fooGridViewModel>()
    .ForMember(dest => dest.foo,
               opt => opt.MapFrom(model => string.Join(",", model.Names
                   .Where(we => we.LastName == "Smith")
                   .Select(o => o.FirstName)))

执行此代码时,我现在在转换中收到错误,指出:从System.Char到System.String的其他信息丢失映射。使用Mapper.CreateMap创建。

//Conversion
public static IQueryable<fooGridViewModel> ToGridViewModels(this IQueryable<fooSource> source)
{
    return source.ProjectTo<fooGridViewModel>();
}

//Controller
[HttpGet]
[BreezeQueryable(MaxExpansionDepth = 10)]
public IQueryable<fooGridViewModel> fooGridViewModels()
{
    return _contextProvider.Context.fooSources.ToGridViewModels();
}

我已经研究了潜在的解决方法AutoMapper: Collection to Single string Property,但不了解如何/在何处放置AsEnumerable方法。

还有Automapper says Missing map from System.String to System.Char? But I see no Char property用于显式映射属性。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

发生错误是因为您正在从IQueryable对象进行映射。您在该对象上调用的任何Linq函数都将是IQueryable版本,被视为正在建立的SQL查询的补充。

执行该查询时,会出现错误,因为适配器无法将大多数C#函数(例如TextView)转换为SQL。

简而言之

  • IQueryable对象会建立一个SQL查询字符串,而不执行它
  • 枚举查询时,SQL发送到数据库,并加载结果
  • 然后您才能调用所需的任何C#函数。

因此,请之前以可控的方式执行查询,以允许使用通用C#函数。

MoreText