为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Automapper 基于 List c# 和 linq 中的 List 进行有效过滤

使用 Automapper 基于 List c# 和 linq 中的 List 进行有效过滤

C#
蝴蝶不菲 2021-06-29 17:39:19
我有以下型号;public class Category : Entity{    public List<CategoryTranslation> Translations { get; set; }    public int Value { get; set; }    public bool AutoTranslate { get; set; }}在哪里public class CategoryTranslation : Entity{    public string Name { get; set; }    public Language Language { get; set; }    public bool PrimaryTranslation { get; set; }}和public class Language : Entity{    public string Country { get; set; }    public string Code { get; set; }    public bool? IsPrimary { get; set; }    public bool IsActive { get; set; }}这个想法是我们可以存储类别的各种翻译。在我们的 API 上,我希望为特定语言提供输出模型;CategoryOutputModel {     public int Id;     public string Name;}其中 name 是从Category.Translations.Name.我是否可以选择具有特定翻译的所有类别,然后只选择该翻译并处理翻译列表中不需要的元素IE//this would return all the categories i need but include all tranlsations and not just the 'en' onescategories.Where(x => x.Translations.Any(y => y.Language.Code == "en"));然后我会寻找用于Automapper将返回的数据(从我的服务)映射到我的输出模型并返回。我假设我需要进行过滤,以便 Automapper 知道如何映射到该Name字段?
查看完整描述

1 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

您可能必须在CategoryTranslationset 而不是Categoryset上进行过滤,然后再GroupBy进行过滤Category。


在实体上设置导航属性

public class Category : Entity

{

    public int Value { get; set; }

    public bool AutoTranslate { get; set; }


    public List<CategoryTranslation> Translations { get; set; }

}


public class CategoryTranslation : Entity

{

    public string Name { get; set; }

    public bool PrimaryTranslation { get; set; }


    public int CategoryId { get; set; }

    public Category Category { get; set; }


    public int LanguageId { get; set; }

    public Language Language { get; set; }

}


public class Language : Entity

{

    public string Country { get; set; }

    public string Code { get; set; }

    public bool? IsPrimary { get; set; }

    public bool IsActive { get; set; }


    public List<CategoryTranslation> CategoryTranslations { get; set; }

}

配置他们的关系

public class AppDbContext : DbContext

{

    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)

    {

    }


    protected override void OnModelCreating(ModelBuilder builder)

    {

        base.OnModelCreating(builder);


        builder.Entity<Category>(b =>

        {

            b.HasKey(x => x.Id);


            b.ToTable("Category");

        });


        builder.Entity<CategoryTranslation>(b =>

        {

            b.HasKey(x => x.Id);

            b.Property(x => x.Name).IsRequired();

            b.HasOne(x => x.Category)

                .WithMany(c => c.Translations)

                .HasForeignKey(x => x.CategoryId);

            b.HasOne(x => x.Language)

                .WithMany(l => l.CategoryTranslations)

                .HasForeignKey(x => x.LanguageId);


            b.ToTable("CategoryTranslation");

        });


        builder.Entity<Language>(b =>

        {

            b.HasKey(x => x.Id);

            b.Property(x => x.Country).IsRequired();

            b.Property(x => x.Code).IsRequired();


            b.ToTable("Language");

        });

    }


    public DbSet<Category> Categories { get; set; }

    public DbSet<CategoryTranslation> CategoryTranslations { get; set; }

    public DbSet<Language> Languages { get; set; }

}

启动时的种子表

    public void Configure(IApplicationBuilder app, AppDbContext dbContext)

    {

        SeedData(dbContext);


        app.UseStaticFiles();

        app.UseMvcWithDefaultRoute();

    }


    private void SeedData(AppDbContext dbContext)

    {

        dbContext.Database.EnsureDeleted();

        dbContext.Database.Migrate();


        Language english = new Language

        {

            IsActive = true,

            IsPrimary = true,

            Country = "United States",

            Code = "en-US"

        };


        Language traditionalChinese = new Language

        {

            IsActive = true,

            IsPrimary = false,

            Country = "Chinese (Taiwan)",

            Code = "zh-TW"

        };


        Language simplifedChinese = new Language

        {

            IsActive = true,

            IsPrimary = false,

            Country = "Chinese (People's Republic of China)",

            Code = "zh-CN"

        };


        Language korean = new Language

        {

            IsActive = true,

            IsPrimary = false,

            Country = "Korea",

            Code = "ko-KR"

        };


        Language japanese = new Language

        {

            IsActive = true,

            IsPrimary = false,

            Country = "Japan",

            Code = "ja-JP"

        };


        Category guitar = new Category

        {

            Value = 1,

            AutoTranslate = true,

            Translations = new List<CategoryTranslation>

            {

                new CategoryTranslation

                {

                    Name = "Guitars",

                    Language = english,

                    PrimaryTranslation = true

                },

                new CategoryTranslation

                {

                    Name = "吉他",

                    Language = traditionalChinese,

                    PrimaryTranslation = false

                },

                new CategoryTranslation

                {

                    Name = "吉他",

                    Language = simplifedChinese,

                    PrimaryTranslation = false

                },

                new CategoryTranslation

                {

                    Name = "기타",

                    Language = korean,

                    PrimaryTranslation = false

                },

                new CategoryTranslation

                {

                    Name = "ギター",

                    Language = japanese,

                    PrimaryTranslation = false

                }

            }

        };


        Category bass = new Category

        {

            Value = 2,

            AutoTranslate = true,

            Translations = new List<CategoryTranslation>

            {

                new CategoryTranslation

                {

                    Name = "Bass",

                    Language = english,

                    PrimaryTranslation = true

                },

                new CategoryTranslation

                {

                    Name = "低音吉他",

                    Language = traditionalChinese,

                    PrimaryTranslation = false

                },

                new CategoryTranslation

                {

                    Name = "低音吉他",

                    Language = simplifedChinese,

                    PrimaryTranslation = false

                }

            }

        };


        dbContext.Categories.AddRange(guitar, bass);

        dbContext.Languages.AddRange(english, traditionalChinese,

            simplifedChinese, korean, japanese);

        dbContext.SaveChanges();

    }

验证数据库

//img1.sycdn.imooc.com//60e00a0b000141c405140551.jpg

设置 AutoMapper 配置文件以映射Category到CategoryOutputModel

public class AutoMapperProfile : Profile

{

    public AutoMapperProfile()

    {

        CreateMap<Category, CategoryOutputModel>()

            .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))

            .ForMember(dest => dest.Name, opt => opt.ResolveUsing(src =>

                // Because of your setup, it doesn't guarantee that

                // there is only one translation came out at the end for a 

                // language code for a category so I used FirstOrDefalt() 

                // here.

                src.Translations.FirstOrDefault()?.Name));

    }

}

public class HomeController : Controller

{

    private readonly AppDbContext _dbContext;

    private readonly IMapper _mapper;


    public HomeController(AppDbContext dbContext,

        IMapper mapper)

    {

        _dbContext = dbContext;

        _mapper = mapper;

    }


    public IActionResult Index()

    {

        var categoryTranslations = _dbContext.CategoryTranslations

            .AsNoTracking()

            .Include(ct => ct.Category)

            .Include(ct => ct.Language)

            .Where(ct => ct.Language.Code == "en-US")

            .ToList();


        var categoryOutputModels = categoryTranslations

            .GroupBy(ct => ct.Category, (key, group) => 

                // Use this map overload to map the category entity

                // to a new CategoryOutputModel object

                _mapper.Map<Category, CategoryOutputModel>(key));


        return View();

    }

}


查看完整回答
反对 回复 2021-07-03
  • 1 回答
  • 0 关注
  • 381 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信