You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();

时,列出的属性顺序是符合声明顺序的。

更新:附上输出结果与代码截图:
LINQPad查询显示输出和属性

以下是脚手架生成的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 19:31:04