我有一个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用于显式映射属性。
任何帮助将不胜感激。
答案 0 :(得分:1)
发生错误是因为您正在从IQueryable对象进行映射。您在该对象上调用的任何Linq函数都将是IQueryable版本,被视为正在建立的SQL查询的补充。
执行该查询时,会出现错误,因为适配器无法将大多数C#函数(例如TextView
)转换为SQL。
简而言之
因此,请之前以可控的方式执行查询,以允许使用通用C#函数。
MoreText