我正在尝试将一个 IEnumerable<IEnumerable<string>>
转换为 ICollection<Character>
,但我很难弄清楚正确的方法,因为一个对象的结构与另一个对象的结构不同。
转换的原因是将json反序列化并通过Entity Framework插入到数据库中。 json数据没有规范化,也不完全匹配数据库的精确结构。 在数据库中,我有一个 电影
和一个 人物
,它们之间有多对多的关系。 它们之间的桥梁表是角色
。 但是json只有一个电影对象,其中包含一组人员对象,每个人员对象都有一个播放角色的字符数组 (IEnumerable<IEnumerable<string>>
)。
基本上,我需要将每个电影的人员及其角色转换为每个电影的角色及其相应的人员。
var movie = dataContractMovies.Select(m => new Movie {
Title = m.Title,
// not sure how to convert each Person and their characters
Characters = // Need to take each Person and their Characters in m.Cast and cast to a new Character and a new Person for which the Character belongs to
});
转换自
public class MovieDataContract {
[DataMember(Name = "title")]
public string Title { get; set; }
[DataMember(Name = "abridged_cast")]
public virtual IEnumerable<Person> Cast { get; set; }
}
[DataContract]
public class Person {
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "characters")]
public IEnumerable<string> Characters { get; set; }
}
转换为
public partial class Movie {
public string Title { get; set; }
public virtual ICollection<Character> Characters { get; set; }
public Movie() {
this.Characters = new HashSet<Character>();
}
}
public partial class Character {
public string Name { get; set; }
public virtual Movie Movie { get; set; }
public virtual Person Person { get; set; }
}
public partial class Person {
public string Name { get; set; }
public virtual ICollection<Character> Characters { get; set; }
public Person() {
this.Characters = new HashSet<Character>();
}
}
更新和进一步问题
如果我只是在MovieDataContract
中添加了一个public IEnumerable<Character> Characters
,那么我就可以像这样做(理论上,尚未测试)...
Characters = m.Characters;
所以我的新的
MovieDataContract
看起来会是这样的...[DataContract]
public class MovieDataContract {
[DataMember(Name = "title")]
public string Title { get; set; }
[DataMember(Name = "abridged_cast")]
private IEnumerable<Person> _cast { get; set; }
public IEnumerable<Character> Characters {
get{
foreach(var person in _cast) {
foreach(string name in person.characters) {
yield return new Character { Name = name, Person = new Person { Name = person.name }}
}
}
}
}
}
string
转换为Character
?如果没有一个好的方法将伪值对象转换为引用对象,解决包装问题也不会对你有太大帮助。 - tmesser