据我所知,没有一种可靠的,有据可查的方式来获取匿名类型属性,这些匿名属性在源文件中声明的顺序使我想知道我是否这样使用EF core的HasIndex:
modelBuilder.Entity<T>(entity => entity.HasIndex(e => new { e.Z, e.A }) )
..是否确定将按列顺序Z,A创建索引?
我不太担心params string
重载形式:
modelBuilder.Entity<T>(entity => entity.HasIndex("Z", "A") )
..因为我想数组元素顺序决定索引列顺序是合乎逻辑的。
但是,我很难使用这种形式,而没有使用硬编码的字符串,因为DbSet<X>
这样定义了:
public virtual DbSet<X> X {get;set;}
..而不是复数Xs
(不是我的规则,但我坚持使用它),所以尝试使用HasIndex(nameof(X.Z), nameof(X.A))
是一个错误,因为最近的可访问X是X的集合,而不是类型X,因此没有我想要的属性nameof
我能够解决此问题的最接近方法是实例化X:
modelBuilder.Entity<SessionChargingProfileLog>(entity =>
{
var x = new X(0, 0, "");
entity.HasIndex(nameof(x.Z), nameof(x.A)).IsClustered().IncludeProperties(nameof(x.B));
});
..这有点..
因此,如果可以具体确认“是的,那HasIndex(e => new { e.Z, e.A })
肯定会创建索引为Z,A”,那将是奇妙的;我会对其进行测试,但我不认为“尝试一下并观察它是否在这种情况下是正确的”意味着它可以保证它总是可以正常工作,而不是“是的,它会因为..”而工作。
据我所知,没有一种可靠的,有据可查的方式来获取匿名类型属性,该匿名属性在源文件中被声明的顺序
您缺少这样一个事实,在这里您不是在运行时通过反射来处理匿名类型,而是要在编译时生成表示匿名类型实例化的表达式树。拉姆达的主体是NewExpression(不是MemberInit
因为它看起来语法),这是一个构造函数调用的参数包含在订单中定义表达式,你指定他们,同时也映射到会员这是专门为匿名类型做:
该
Members
属性提供了构造函数参数和与这些值相对应的类型成员之间的映射。在构造匿名类型的情况下,此属性将构造函数参数映射到匿名类型公开的属性。此映射信息很重要,因为通过节点的Constructor
或Arguments
属性无法发现由匿名类型的构造初始化的字段或访问这些字段的属性NewExpression
。
关于顺序,匿名类型的文档说:
如果程序集中的两个或多个匿名对象初始化程序指定了一系列顺序相同,名称和类型相同的属性,则编译器会将这些对象视为相同类型的实例。它们共享相同的编译器生成的类型信息。
因此,由于初始化的顺序是匿名类型标识的一部分,因此它应由编译器保留,并依次反映在编译器生成的lambda表达式中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句