
转换的原因是采用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>(); }} 更新和进一步的问题
如果我刚刚添加了一个公共的IEnumerable< Character> MovIEDataContract的字符?然后我可以做这样的事情(理论上,没有测试过)……
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 }} } } } }}解决方法 我为答案做了一些假设:1.我们只是插入新电影,而不是更新数据库中已有的电影. 2.我们正在使用实体框架来执行插入 *** 作. 3.正在添加的电影中的人不在与其他电影相关联的数据库中.每部电影都有一个演员阵容,每个演员至少有一个角色. 冒着被冷却的小孩巴士扔掉的风险我的解决方案不使用liNQ,虽然我确信可以修改它来这样做.请注意,使用EF时,您无需设置关联的两端即可将其插入数据库.
// Lookup is necessary because a person might be in more than one movIE.var personLookup = new Dictionary<string,Person>();foreach (var contractMovIE in dataContractMovIEs){ var movIE = new MovIE() { Title = contractMovIE.Title }; foreach (var contractPerson in contractMovIE.Cast) { if (!personLookup.ContainsKey(contractPerson.name)) { personLookup.Add(contractPerson.name,new Person() { name = contractPerson.name }); } var person = personLookup[contractPerson.name]; foreach (var contractCharacter in contractPerson.Characters) { var character = new Character() { name = contractCharacter.name,Person = person,MovIE = movIE }; dataContext.Characters.Add(character); } } } dataContext.SaveChanges(); 如果DataContract将MovIE映射到Character而不是Person(就像你在评论中建议的那样),你可以得到更像这样的东西:
var personLookup = new Dictionary<string,Person>();var movIE = dataContractMovIEs.Select(m => new MovIE { Title = m.Title,Characters = m.Characters.Select(c => new Character() { name = c.name,Person = LookupPerson(c.Person,personLookup) }).ToList()});public Person LookupPerson(string personname,Dictionary<string,Person> personLookup){ if (!personLookup.ContainsKey(personname)) { personLookup.Add(personname,new Person() { name = personname }); } return personLookup[personname];} 总结 以上是内存溢出为你收集整理的c# – 从IEnumerable转换为ICollection全部内容,希望文章能够帮你解决c# – 从IEnumerable转换为ICollection所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)