我有一个映射文件,用于将值映射到模型以保存到我的数据库。在我的数据库表中,我有6个字段(Key1,Key2,Key3,Key4,Key5,Key6)。 我的模型看起来像这样:
public string Key1 { get; set; }
public string Key2 { get; set; }
public string Key3 { get; set; }
public string Key4 { get; set; }
public string Key5 { get; set; }
public string Key6 { get; set; }
我在映射文件中得到的值如下:
.ForMember(dto => dto.Keywords, opt => opt.MapFrom(src => new List<string> { src.Key1, src.Key2, src.Key3, src.Key4, src.Key5, src.Key6 }.Where(s => !string.IsNullOrEmpty(s))));
但是,我现在想要反过来这样做,以便可以更改值并将其发送回数据库。我想在一行中完成,就像我首先得到列表一样
目前,我必须在列表上执行ElementAtOrDefault()
,以便在每个字段中存储每个值,如果它不为空。
我目前的代码:
entity.Key1 = dto.Keywords.ElementAtOrDefault(0) != null ? dto.Keywords[0] : null;
entity.Key2 = dto.Keywords.ElementAtOrDefault(1) != null ? dto.Keywords[1] : null;
entity.Key3 = dto.Keywords.ElementAtOrDefault(2) != null ? dto.Keywords[2] : null;
entity.Key4 = dto.Keywords.ElementAtOrDefault(3) != null ? dto.Keywords[3] : null;
entity.Key5 = dto.Keywords.ElementAtOrDefault(4) != null ? dto.Keywords[4] : null;
entity.Key6 = dto.Keywords.ElementAtOrDefault(5) != null ? dto.Keywords[5] : null;
有更简单的方法吗?
答案 0 :(得分:1)
您可以为IList<T>
创建一个扩展方法来帮助您:
public static T ValueOrDefault<T>(this IList<T> source, int index)
{
return source.Count > index ? source[index] : default(T);
}
使用如下:
entity.Key1 = dto.Keywords.ValueOrDefault(0);
我无法看到许多其他简化方法,这些方法不会降低可读性。
答案 1 :(得分:1)
你可以列出一系列采用DTO和分配的函数,并将循环“折叠”成一行:
private static Func<MyDto,string,string>[] Setters = new Func<MyDto,string,string>[] {
(dto, s) => dto.Key1=s
, (dto, s) => dto.Key2=s
, (dto, s) => dto.Key3=s
, (dto, s) => dto.Key4=s
, (dto, s) => dto.Key5=s
, (dto, s) => dto.Key6=s
};
有了这个声明,你可以这样做:
dto.Keywords.Zip(Setters, (str, setter) => setter(entity, str)).ToList();
ToList()
的调用强制枚举对Zip
的调用,entity
在枚举列表时执行Keywords
成员的分配。到达列表末尾时,呼叫停止。
这假设KeyXYZ
中的字符串是非空且非空的。
请注意,如果列表短于6,则剩余的null
将保留您之前分配给它们的值。如果您想强制将Concat
分配给剩余的值,请使用dto.Keywords
// This line adds nulls for missing items
.Concat(Enumerable.Repeat(null, Math.Max(Setters.Length-dto.Keywords.Length, 0)))
.Zip(Setters, (str, setter) => setter(entity, str))
.ToList();
方法,如下所示:
Math.Max(..., 0)
Key
的调用可以为列表中的项目数量多于DTO中{{1}}项的情况添加保护。