gpt4 book ai didi

c# - EF 核心的 HasIndex(Expression>) 是否始终使索引排序正确?

转载 作者:行者123 更新时间:2023-12-04 01:05:24 26 4
gpt4 key购买 nike

据我所知,没有一种可靠的、有记录的方法来按照它们在源文件中声明的顺序获取匿名类型属性,这让我想知道我是否因此使用 EF 核心的 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 索引”,那就太棒了;我会测试它,但我不认为“尝试并观察它在这种情况下是否正确”意味着它保证它总是会成功,而不是“是的,它会成功,因为......”

最佳答案

As far as I'm aware, there isn't a reliable, documented way to get anonymous type properties in the order that they're declared in a source file

您忽略了一个事实,即您在这里不是通过反射在运行时处理匿名类型,而是使用编译时生成的表示匿名类型实例化的表达式树。 lambda 的主体是 NewExpression (不是语法上看起来的 MemberInit),这是一个带有 Arguments 的构造函数调用按照您指定的顺序包含定义表达式,并映射到 Members这是专门为匿名类型制作的:

The Members property provides a mapping between the constructor arguments and the type members that correspond to those values. In the case of the construction of an anonymous type, this property maps the constructor arguments to the properties that are exposed by the anonymous type. This mapping information is important because the fields that are initialized by the construction of an anonymous type, or the properties that access those fields, are not discoverable through the Constructor or Arguments properties of a NewExpression node.

关于Anonymous Types的订单,文档呢?说:

If two or more anonymous object initializers in an assembly specify a sequence of properties that are in the same order and that have the same names and types, the compiler treats the objects as instances of the same type. They share the same compiler-generated type information.

因此,由于初始化顺序是匿名类型标识的一部分,因此它应该由编译器保留,并反过来反射(reflect)在编译器生成的 lambda 表达式中。

关于c# - EF 核心的 HasIndex(Expression<Func<T,object>>) 是否始终使索引排序正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66663635/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com