c# - 我如何映射表达式> 到表达式>?
问题描述
我需要在这两个表达式之间进行映射
但我有复杂的模型映射逻辑
我的实体:
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 的视图中获取表达式,而不是将其转换为我的实体。
解决方案
推荐阅读
- firebase - 谷歌分析访问旧数据
- angular - 角度材料:更改选项组的背景颜色不起作用
- sql - Amazon Redshift 使用 COPY 命令仅从 JSON 中获取 1 行
- node.js - 一些 axios.get 请求失败并显示“请求失败,状态码 404”
- amazon-web-services - 如何加密并安全存储和传输 SSH 的私钥
- dojo - IBM Navigator:ecm/widget/listView/ContentList 带复选框
- json - 根据子对象中是否存在条目进行过滤
- mongodb - Mongoose Bulkwrite:nModified 的触发器
- kendo-ui - 如何为十六进制颜色代码自定义 Kendo UI 编辑器?
- ssms - 是否不再可以使用 SSMS 编写用户和权限脚本?