EF核心的HasIndex(Expression <Func <T,object >>)是否始终获得正确的索引顺序?

凯斯·贾德

据我所知,没有一种可靠的,有据可查的方式来获取匿名类型属性,这些匿名属性在源文件中声明的顺序使我想知道我是否这样使用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”,那将是奇妙的;我会对其进行测试,但我不认为“尝试一下并观察它是否在这种情况下是正确的”意味着它可以保证它总是可以正常工作,而不是“是的,它会因为..”而工作。

伊万·斯托夫(Ivan Stoev)

据我所知,没有一种可靠的,有据可查的方式来获取匿名类型属性,该匿名属性在源文件中被声明的顺序

您缺少这样一个事实,在这里您不是在运行时通过反射来处理匿名类型,而是要在编译时生成表示匿名类型实例化的表达式树。拉姆达的主体是NewExpression(不是MemberInit因为它看起来语法),这是一个构造函数调用的参数包含在订单中定义表达式,你指定他们,同时也映射到会员这是专门为匿名类型做:

Members属性提供了构造函数参数和与这些值相对应的类型成员之间的映射。在构造匿名类型的情况下,此属性将构造函数参数映射到匿名类型公开的属性。此映射信息很重要,因为通过节点ConstructorArguments属性无法发现由匿名类型的构造初始化的字段或访问这些字段的属性NewExpression

关于顺序,匿名类型的文档说:

如果程序集中的两个或多个匿名对象初始化程序指定了一系列顺序相同,名称和类型相同的属性,则编译器会将这些对象视为相同类型的实例。它们共享相同的编译器生成的类型信息。

因此,由于初始化的顺序是匿名类型标识的一部分,因此它应由编译器保留,并依次反映在编译器生成的lambda表达式中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法从 `Expression<Func<T1, T2>>` 转换为 `Expression<Func<object, object>>`

来自分类Dev

将Expression <Func <T,TProperty >>转换为Expression <Func <object,object >>,反之亦然

来自分类Dev

是否可以将Expression <Func <T,bool >>转换为Expression <Func <MyType,bool >>?

来自分类Dev

Expression <Func <T,object >>到Expression <Func <T,TResult >>的一般拆箱

来自分类Dev

获取由Expression <Func <T,U >>访问的每个属性的Expression <Func <T,object >>

来自分类Dev

Expression <Func <T,object >>到Expression <Func <T,TResult >>的一般拆箱

来自分类Dev

如何将Expression <Func <T,object >>转换为Expression <Func <T,bool >>?

来自分类Dev

Func <T>是否获得每个调用的结果?

来自分类Dev

在方法中使用IEnumerable <Expression <Func <T,Object >>>

来自分类Dev

使用List <Func <T,object >>时,索引超出数组的范围

来自分类Dev

使用List <Func <T,object >>时,索引超出数组的范围

来自分类Dev

将Func <T,TProperty>转换为Expression <Func <T,Property >>

来自分类Dev

方法重载中的 Expression<Func<T,bool>> 与 Func<T,bool>

来自分类Dev

正文Expression <Func <T,bool >>的复杂编辑

来自分类Dev

有什么方法可以分解Expression <Func <T,Bool >>并获得相等比较的右侧?

来自分类Dev

将Expression <Func <T1 >>转换为Expression <Func <T1,T2 >>

来自分类Dev

使用Expression <Func <T,object >>中的信息创建运行时谓词

来自分类Dev

从属性名称到将Expression <Func <T,object >>传递给映射方法

来自分类Dev

将Expression <Func <T,V >>转换为Expression <Func <T,Nullable <V >>>

来自分类Dev

是否可以在字典中存储Func <T>?

来自分类Dev

将 Expression<Func<Tin, object>> 转换为 Expression<Func<Tin, Tout>>

来自分类Dev

如何将 Expression<Func<TSource,string>> 转换为 Expression<Func<object,string>>

来自分类Dev

如何获取Expression <Func <T,TK >>的T的实例

来自分类Dev

如何合并两个 Expression<Func<T, T>

来自分类Dev

如何获取Expression <Func <object >>目标对象设置值?

来自分类Dev

将Expression <Func <T,bool >>转换为Expression <Func <T1,bool >>,以便T是T1的成员

来自分类Dev

将表达式转换为Expression <Func <T,bool >>

来自分类Dev

在IGrouping中使用Where(Expression <Func <T,bool >>)

来自分类Dev

从Expression <Func <T,bool >>实体框架返回所有实体

Related 相关文章

  1. 1

    无法从 `Expression<Func<T1, T2>>` 转换为 `Expression<Func<object, object>>`

  2. 2

    将Expression <Func <T,TProperty >>转换为Expression <Func <object,object >>,反之亦然

  3. 3

    是否可以将Expression <Func <T,bool >>转换为Expression <Func <MyType,bool >>?

  4. 4

    Expression <Func <T,object >>到Expression <Func <T,TResult >>的一般拆箱

  5. 5

    获取由Expression <Func <T,U >>访问的每个属性的Expression <Func <T,object >>

  6. 6

    Expression <Func <T,object >>到Expression <Func <T,TResult >>的一般拆箱

  7. 7

    如何将Expression <Func <T,object >>转换为Expression <Func <T,bool >>?

  8. 8

    Func <T>是否获得每个调用的结果?

  9. 9

    在方法中使用IEnumerable <Expression <Func <T,Object >>>

  10. 10

    使用List <Func <T,object >>时,索引超出数组的范围

  11. 11

    使用List <Func <T,object >>时,索引超出数组的范围

  12. 12

    将Func <T,TProperty>转换为Expression <Func <T,Property >>

  13. 13

    方法重载中的 Expression<Func<T,bool>> 与 Func<T,bool>

  14. 14

    正文Expression <Func <T,bool >>的复杂编辑

  15. 15

    有什么方法可以分解Expression <Func <T,Bool >>并获得相等比较的右侧?

  16. 16

    将Expression <Func <T1 >>转换为Expression <Func <T1,T2 >>

  17. 17

    使用Expression <Func <T,object >>中的信息创建运行时谓词

  18. 18

    从属性名称到将Expression <Func <T,object >>传递给映射方法

  19. 19

    将Expression <Func <T,V >>转换为Expression <Func <T,Nullable <V >>>

  20. 20

    是否可以在字典中存储Func <T>?

  21. 21

    将 Expression<Func<Tin, object>> 转换为 Expression<Func<Tin, Tout>>

  22. 22

    如何将 Expression<Func<TSource,string>> 转换为 Expression<Func<object,string>>

  23. 23

    如何获取Expression <Func <T,TK >>的T的实例

  24. 24

    如何合并两个 Expression<Func<T, T>

  25. 25

    如何获取Expression <Func <object >>目标对象设置值?

  26. 26

    将Expression <Func <T,bool >>转换为Expression <Func <T1,bool >>,以便T是T1的成员

  27. 27

    将表达式转换为Expression <Func <T,bool >>

  28. 28

    在IGrouping中使用Where(Expression <Func <T,bool >>)

  29. 29

    从Expression <Func <T,bool >>实体框架返回所有实体

热门标签

归档