> 到表达式>?,c#,mapping,expression-trees"/>

首页 > 解决方案 > 我如何映射表达式> 到表达式>?

问题描述

我需要在这两个表达式之间进行映射

但我有复杂的模型映射逻辑

我的实体:

public abstract class BaseEntity<TKey>
{
    public virtual TKey Id { get; set; }
}

public class ContentTranslation : BaseEntity<int>
{
    public int ContentId { get; set; }
    public Content Content { get; set; }
    public string Text { get; set; }
    public Language Language { get; set; }
}

public class Content : BaseEntity<int>
{
    public ContentType ContentType { get; set; }
    public ICollection<ContentTranslation> Translations { get; set; }
    public State State { get; set; }
    public FAQ Faq { get; set; }
    public Announcement Announcement { get; set; }
}

public class FAQ : BaseEntity<int>
{
    public string Tag { get; set; }
    public int ContentId { get; set; }
    public Content Content { get; set; }
}

public class Announcement : BaseEntity<int>
{
    public string Header { get; set; }
    public DateTime ValiUntil { get; set; }
    [ForeignKey("Content")]
    public int ContentId { get; set; }
    public Content Content { get; set; }
}

我的 DTO:

public class AnnouncementModel
{
    public int ContentId { get; set; }
    [JsonConverter(typeof(StringEnumConverter))]
    public State State { get; set; }
    public string Header { get; set; }
    public DateTime ValiUntil { get; set; }
}

public class ContentDto
{
    public int Id { get; set; }
    public JObject Content { get; set; }
    public Dictionary<Language,TranslationDTO> Translations { get; set; }
}

public class FaqModel
{
    public int ContentId { get; set; }
    [JsonConverter(typeof(StringEnumConverter))]
    public State State { get; set; }
    public string MainTag { get; set; }
}

如何创建此映射方法?

我知道自动映射器具有执行此类逻辑的功能

但我有序列化(JObject 属性),所以很难使用 automapper

在方法(Content 和 ContentDto)中仅映射两个模型就足够了吗?_______UPDATE_________ 我有两种内容类型 FAQ 和 Announcement 它们存储在不同的表中 在 conbtent 表中有 ContentType,我可以根据它选择特定类型的内容,然后将其序列化到我的 JObject 内容 这里有一些代码

//获取通知模型存储在jobject中

private AnnouncementModel GetAnnouncement(int contentId, ContentType contentType)
    {
        var model = (from content in context.Contents
                     join announcement in context.Announcements on content.Id equals announcement.ContentId
                     where content.ContentType == ContentType.Announcement
                     && content.Id == contentId
                     select new AnnouncementModel()
                     {
                         ContentId = content.Id,
                         State = content.State,
                         Header = announcement.Header,
                         ValiUntil = announcement.ValiUntil
                     })
                    .FirstOrDefault();
        return model;
    }

//获取FAQ以存储在JOBJect中

  private FaqModel GetFaq(int contentId, ContentType contentType)
    {
        var model = (from content in context.Contents
                     join faq in context.FAQs on content.Id equals faq.ContentId
                     where content.ContentType == ContentType.FAQ
                     && content.Id == contentId
                     select new FaqModel()
                     {
                         ContentId = content.Id,
                         State = content.State,
                         MainTag = faq.Tag
                     })
                    .FirstOrDefault();
        return model;
    }

//将类型转换为存储在Jobject中

  private JObject GetContentAsync(ContentType contentType, int contentID)
    {
        var settings = new JsonSerializerSettings { Converters = new JsonConverter[] { new StringEnumConverter() } };
        if (contentType == ContentType.FAQ)
        {
            var faq = GetFaq(contentID, contentType);
            return JObject.FromObject(faq, JsonSerializer.Create(settings));
        }
        if (contentType == ContentType.Announcement)
        {
            var annoncement = GetAnnouncement(contentID, contentType);
            return JObject.FromObject(annoncement, JsonSerializer.Create(settings));
        }
        else
            return null;
    }

//以translationDTO(翻译的内容文本)和语言为键获取内容字典的方法

 private Tuple<Content, Dictionary<Language, TranslationDTO>> GetContentAndRelatedListOfTransactionById(int contentId)
    {
        var query =
            from content in context.Contents
            join translation in context.ContentTranslations on content.Id equals translation.ContentId
            where content.Id == contentId
            select new Tuple<Content, ContentTranslation>(content, translation);
        if (query != null)
            return new Tuple<Content, Dictionary<Language, TranslationDTO>>(query.FirstOrDefault()?.Item1,
                query.Select(p => p.Item2)?.ConvertToDictTranslations());
        else
            return null;//tuple is empty
    }

//而且我可以像这里一样创建模型

public ContentDto MapToContentDTO(Content contentEntity)
    {
        var model = GetContentByIdWithTranslation(contentEntity.Id, contentEntity.ContentType);
        return model;
    }

我想转换表达式,因为我想在我的数据库表上运行但我从 DTO 的视图中获取表达式,而不是将其转换为我的实体。

标签: c#mappingexpression-trees

解决方案


推荐阅读