C# ASP.NET EF查询中列对象顺序异常问题求助
问题描述
需要让日期排在第一位、原因排在第二位,但部分数据的Column列表顺序颠倒:部分数据中[0]为原因、[1]为日期,另一部分数据中[0]是日期、[1]是原因。
EF查询代码
List<Row> callDetailsList = ( from a in _db.Calls.AsNoTracking() join b in _db.ContactMethods.AsNoTracking() on a.Contact_Method_ID equals b.contact_method_id into g1 from s1 in g1.DefaultIfEmpty() where a.RegardingEntity_ID == member_detail.MemberID select new Row { Column = new List<Column> { new Column{ text = a.Create_Date.ToString() }, new Column { text = string.IsNullOrEmpty(s1.description) ? " " : s1.description.Trim() }, } }).ToList();
数据模型代码
public class Column { [XmlAttribute(AttributeName = "text")] public string text { get; set; } } public class Row { [XmlElement(ElementName = "Column")] public List<Column> Column { get; set; } }
现象说明
- 第三组数据:[0]是原因,[1]是日期
- 第一组数据:[0]是日期,[1]是原因
解决方案
问题根源在于使用List<Column>结合[XmlElement]序列化时,极端情况下集合元素的顺序可能被干扰(比如EF查询优化、序列化内部逻辑)。可以通过以下方式强制顺序:
修改数据模型
将List<Column>拆分为两个独立属性,并通过Order属性指定序列化顺序:
public class Column { [XmlAttribute(AttributeName = "text")] public string text { get; set; } } public class Row { [XmlElement(ElementName = "Column", Order = 1)] public Column DateColumn { get; set; } [XmlElement(ElementName = "Column", Order = 2)] public Column ReasonColumn { get; set; } }
修改EF查询投影
对应调整对象初始化逻辑,明确给两个属性赋值:
List<Row> callDetailsList = ( from a in _db.Calls.AsNoTracking() join b in _db.ContactMethods.AsNoTracking() on a.Contact_Method_ID equals b.contact_method_id into g1 from s1 in g1.DefaultIfEmpty() where a.RegardingEntity_ID == member_detail.MemberID select new Row { DateColumn = new Column{ text = a.Create_Date.ToString() }, ReasonColumn = new Column { text = string.IsNullOrEmpty(s1.description) ? " " : s1.description.Trim() }, }).ToList();
通过Order属性可强制序列化时先输出日期对应的Column,再输出原因对应的Column,彻底避免顺序颠倒问题。
内容的提问来源于stack exchange,提问作者Tharindu Perera
相关产品推荐
相关产品推荐

