LINQPad 8与LINQPad 5 Dump属性顺序差异及默认配置问询
问题描述
在使用Linq-to-Sql的DataContext的LINQPad 5中,执行代码:
Users.Take(5).Dump();
结果面板里的属性顺序和.dbml文件定义顺序一致,也就是和生成的C#类属性声明顺序相同。
但在使用EF Core的DbContext的LINQPad 8中,输出同一张表时,属性始终按字母顺序排列,而不是脚手架生成类里的属性声明顺序。
想知道能不能设置默认按属性声明顺序进行Dump输出?
之前看到过调整Dump属性顺序的相关内容,但更希望直接实现按类中属性出现顺序输出的默认行为。另外通过反射执行:
typeof(KAT.Camelot.DbContexts.Evolution.AWS.User).GetProperties().Dump();
时,列出的属性顺序是符合声明顺序的。
更新:附上输出结果与代码截图:
以下是脚手架生成的User类代码:
[Table("User")] [Index("AuthID", "GroupKey", Name = "UniqueAuthID", IsUnique = true)] [Index("Email", "GroupKey", Name = "UniqueEmail", IsUnique = true)] public partial class User { [Key] [Column("User_id")] public int Key { get; set; } /// <summary> /// 关联Group表的外键 /// </summary> [Column("User_Group_id")] public int? GroupKey { get; set; } [Column("User_Authenticate_id")] [StringLength(100)] [Unicode(false)] public string? AuthID { get; set; } [Column("User_Register_id")] [StringLength(255)] [Unicode(false)] public string? RegisterID { get; set; } [Column("User_Profile", TypeName = "text")] public string? Profile { get; set; } [Column("User_Email")] [StringLength(200)] [Unicode(false)] public string? Email { get; set; } [Column("User_Pin")] [StringLength(100)] [Unicode(false)] public string? Pin { get; set; } [Column("User_Timeout", TypeName = "datetime")] public DateTime? Timeout { get; set; } [Column("Create_Date", TypeName = "datetime")] public DateTime? CreateDate { get; set; } [Column("Mod_Date", TypeName = "datetime")] public DateTime? UpdateDate { get; set; } /// <summary> /// 用户最后一次登录系统的日期 /// </summary> [Column("User_LastOn", TypeName = "smalldatetime")] public DateTime? LastOnDate { get; set; } /// <summary> /// 用户是否能登录系统 /// </summary> [Column("User_Active")] public bool? Active { get; set; } [Column("userPasswordExpire", TypeName = "smalldatetime")] public DateTime? PasswordExpire { get; set; } [Column("uFailureCount")] public int? FailureCount { get; set; } [Column("userAdmin")] public bool? Admin { get; set; } /// <summary> /// 管理员登录用的AuthID(当用户同时是参与者和管理员时使用,可与真实AuthID不同) /// </summary> [Column("uAdminAuthID")] [StringLength(255)] [Unicode(false)] public string? AdminAuthID { get; set; } [Column("User_Token")] [StringLength(50)] [Unicode(false)] public string? Token { get; set; } /// <summary> /// 与浏览器Cookie匹配时可自动登录 /// </summary> [Column("User_AutoLogon")] [StringLength(50)] [Unicode(false)] public string? AutoLogon { get; set; } [Column("uStayLoggedIn")] public bool? StayLoggedIn { get; set; } [Column("uProcessed")] public bool? Processed { get; set; } [Column("uIVRPin")] [StringLength(20)] [Unicode(false)] public string? IVRPin { get; set; } [Column("uEmailReset")] [StringLength(200)] [Unicode(false)] public string? EmailReset { get; set; } [Column("uSingleSignOnID")] [StringLength(100)] [Unicode(false)] public string? SingleSignOnID { get; set; } [Column("uAuthenticatorKey")] [StringLength(15)] [Unicode(false)] public string? AuthenticatorKey { get; set; } [Column("uMobileNumber")] [StringLength(15)] [Unicode(false)] public string? MobileNumber { get; set; } [Column("uAuthenticatorGrace")] public int? AuthenticatorGrace { get; set; } [ForeignKey("GroupKey")] [InverseProperty("Users")] public virtual Group? Group { get; set; } [InverseProperty("User")] public virtual ICollection<Preference> Preferences { get; set; } = new List<Preference>(); }
解决方案
要让LINQPad 8默认按类属性声明顺序Dump EF Core实体,有两种可行方式:
1. 全局配置(推荐)
在LINQPad的My Extensions中添加以下代码,实现全局默认的属性排序规则:
void Main() {} public static class DumpExtensions { static DumpExtensions() { // 替换默认Dump设置,按属性声明顺序排序 LINQPad.Extensions.DumpOptions.Default.PropertyOrder = MemberOrder.Declaration; } }
保存后,所有后续的Dump()调用都会自动按类中属性的声明顺序显示,无需修改单个查询代码。
2. 单个查询临时设置
如果只需要针对特定查询调整顺序,可以在查询开头添加:
LINQPad.Extensions.DumpOptions.Default.PropertyOrder = MemberOrder.Declaration;
或者直接在Dump方法中指定选项:
Users.Take(5).Dump(o => o.PropertyOrder = MemberOrder.Declaration);
原理说明
LINQPad 8对EF Core实体的默认排序是字母序,但提供了MemberOrder.Declaration枚举值,用于指定按反射获取的属性声明顺序排序——这和你用GetProperties()看到的顺序一致,刚好符合需求。
内容的提问来源于stack exchange,提问作者Terry
相关产品推荐
相关产品推荐

