C# 是否有一种通用方法将列表和目标特定值连接到属性?

C# 是否有一种通用方法将列表和目标特定值连接到属性?,c#,generics,join,linq-to-sql,C#,Generics,Join,Linq To Sql,我想找到一种方法,以一种通用的方式重现下面的代码。在我使用的软件中,我们经常比较如下两个对象列表: d.FeatureViewModels = (from feature in d.FeatureViewModels join pairedFeature in s.FeaturePairTransit on feature.Id equals pairedFeature.Feature.Id sel

我想找到一种方法,以一种通用的方式重现下面的代码。在我使用的软件中,我们经常比较如下两个对象列表:

 d.FeatureViewModels = (from feature in d.FeatureViewModels
                        join pairedFeature in s.FeaturePairTransit on feature.Id equals pairedFeature.Feature.Id
                        select new FeatureViewModel
                        {
                            Id = feature.Id,
                            Name = feature.Name,
                            DisplayOrder = feature.DisplayOrder,
                            MembershipId = feature.MembershipId,
                            IsPaired = pairedFeature.IsPaired,
                            TranslationId = feature.TranslationId,
                            DisplayNameViewModel = feature.DisplayNameViewModel,
                            DescriptionViewModel = feature.DescriptionViewModel
                        }).ToList();
如您所见,需要添加的字段已显示,其他字段均来自功能。这也与应用程序中其他地方的许多对象类似。我不希望每次都复制、粘贴和修改上面的代码,我希望有一个通用的方法,如果可能的话,我可以重用它。为此,我需要一些帮助

有人能帮忙吗

大卫

编辑 根据Matias的回答和评论,我认为我必须更准确:

FeaturePairTransit类如下所示:

public class FeaturePairTransit
    {
        public Feature Feature { get; set; }
        public bool IsPaired { get; set; }
    }
此外,FeatureViewModel已在其中显示属性 我想要实现的是找到一种将FeaturePairTransit.IsPaired映射到FeatureViewModel.IsPaired的方法,并重用该模式

下面是该特定问题的完整自动映射代码:

    Mapper.CreateMap<SKUFeatureTransit, SKUFeaturePivotViewModel>()
// Will give a different level error
                    //.ForMember(d => d.FeatureViewModels.Select(x => x.IsPaired), opt => opt.MapFrom(s => s.FeaturePairTransit.Select(x => x.IsPaired)))
                    .AfterMap((s, d) => d.SKUViewModel = Mapper.Map<SKUViewModel>(s.SKU))
                    .AfterMap((s, d) =>
                    {
                        // This is mandatory because we need to instantiate every translation fields with the constructor.
                        d.FeatureViewModels = Mapper.Map<IList<FeatureViewModel>>(s.FeaturePairTransit.Select(x => x.Feature));

                        // We cannot map an individual property (IsPaired) from a different level. So we did this comparaison.
                        d.FeatureViewModels = (from feature in d.FeatureViewModels
                                               join pairedFeature in s.FeaturePairTransit on feature.Id equals pairedFeature.Feature.Id
                                               select new FeatureViewModel
                                               {
                                                   Id = feature.Id,
                                                   Name = feature.Name,
                                                   DisplayOrder = feature.DisplayOrder,
                                                   MembershipId = feature.MembershipId,
                                                   IsPaired = pairedFeature.IsPaired,
                                                   TranslationId = feature.TranslationId,
                                                   DisplayNameViewModel = feature.DisplayNameViewModel,
                                                   DescriptionViewModel = feature.DescriptionViewModel
                                               }).ToList();
                    });
Mapper.CreateMap()
//将给出不同级别的错误
//.FormMember(d=>d.FeatureViewModels.Select(x=>x.IsPaired),opt=>opt.MapFrom(s=>s.FeaturePairTransit.Select(x=>x.IsPaired)))
.AfterMap((s,d)=>d.SKUViewModel=Mapper.Map(s.SKU))
.AfterMap((s,d)=>
{
//这是必需的,因为我们需要用构造函数实例化每个翻译字段。
d、 FeatureViewModels=Mapper.Map(s.FeaturePairTransit.Select(x=>x.Feature));
//我们无法从不同的级别映射单个属性(iPaired)。因此我们进行了此比较。
d、 FeatureViewModels=(来自d.FeatureViewModels中的要素
在s.FeaturePairTransit on feature.Id等于pairedFeature.feature.Id中加入pairedFeature
选择新功能ViewModel
{
Id=功能。Id,
Name=feature.Name,
DisplayOrder=feature.DisplayOrder,
MembershipId=feature.MembershipId,
IsPaired=pairedFeature.IsPaired,
TranslationId=特征.TranslationId,
DisplayNameViewModel=feature.DisplayNameViewModel,
DescriptionViewModel=功能。DescriptionViewModel
}).ToList();
});
然后,我看到了两个选项,也许有@Matias所说的那样AutoMapper可以处理的东西,我仍在尝试解决,或者我可以用一种通用的方式进行映射。有什么建议吗?

您可以将代码转换为:

 d.FeatureViewModels = (from feature in d.FeatureViewModels
                        join pairedFeature in s.FeaturePairTransit on feature.Id equals pairedFeature.Feature.Id
                        select mapper.Map<Feature, FeatureViewModel>(feautre)).ToList();
d.FeatureViewModels=(来自d.FeatureViewModels中的功能
在s.FeaturePairTransit on feature.Id等于pairedFeature.feature.Id中加入pairedFeature
选择mapper.Map(feautre)).ToList();
@devuxer在一些评论中说:


是的,但不是那么简单。您还需要一个CreateMap语句

好的,因为看起来视图模型和域对象具有相同的属性。。。。你需要打电话给…:

var mapperConfig = new MapperConfiguration(cfg => {
    cfg.CreateMap<Feature, FeatureViewModel>();
});

var mapper = mapperConfig.CreateMapper();
var-mapperConfig=新的MapperConfiguration(cfg=>{
CreateMap();
});
var mapper=mapperConfig.CreateMapper();

…在调用
mapper.Map(…)
之前

我终于找到了我要找的东西

这并不像我想象的那样通用,但这是朝着正确方向迈出的一大步

// HTTPGET
            Mapper.CreateMap<SKUFeatureTransit, SKUFeaturePivotViewModel>()
                .AfterMap((s, d) => d.SKUViewModel = Mapper.Map<SKUViewModel>(s.SKU))
                .AfterMap((s, d) =>
                {
                    // This is mandatory because we need to instantiate every translation fields with the constructor.
                    d.FeatureViewModels = Mapper.Map<IList<FeatureViewModel>>(s.FeaturePairTransit.Select(x => x.Feature));

                    // We cannot map an individual property (IsPaired) from a different level. So we did this comparaison.
                    d.FeatureViewModels = d.FeatureViewModels.Join(s.FeaturePairTransit, vModel => vModel.Id, source => source.Feature.Id, (dest, source) =>
                    {
                        dest.IsPaired = source.IsPaired;
                        return dest;
                    }).ToList();
                });
//HTTPGET
Mapper.CreateMap()
.AfterMap((s,d)=>d.SKUViewModel=Mapper.Map(s.SKU))
.AfterMap((s,d)=>
{
//这是必需的,因为我们需要用构造函数实例化每个翻译字段。
d、 FeatureViewModels=Mapper.Map(s.FeaturePairTransit.Select(x=>x.Feature));
//我们无法从不同的级别映射单个属性(iPaired)。因此我们进行了此比较。
d、 FeatureViewModels=d.FeatureViewModels.Join(s.FeaturePairTransit,vModel=>vModel.Id,source=>source.Feature.Id,(dest,source)=>
{
dest.IsPaired=source.IsPaired;
返回目的地;
}).ToList();
});
希望这能帮助别人


大卫:是的,但不是那么简单。您还需要一个
CreateMap
语句。@devuxer很好,但它已经满足了在一个点上概括问题,然后在任何地方重复使用以避免复制粘贴的要求programming@devuxer现在OP有了一个很好的起点来了解AutoMapper是如何工作的!如果IsPaired来自不同的级别怎么办?比要精确的特征高一级…@DavidLétourneau嘿!我已经给你指出了正确的工具。现在轮到你了:看看文档,了解如何成为汽车制造商的专家:)