Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 为什么这两种匿名类型不一样?_Entity Framework_Linq_Roslyn_Anonymous Types_Ef Core 2.0 - Fatal编程技术网

Entity framework 为什么这两种匿名类型不一样?

Entity framework 为什么这两种匿名类型不一样?,entity-framework,linq,roslyn,anonymous-types,ef-core-2.0,Entity Framework,Linq,Roslyn,Anonymous Types,Ef Core 2.0,有人能告诉我为什么这两种匿名类型不一样吗 {Name = "<>f__AnonymousType0`6" FullName = "<>f__AnonymousType0`6[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral

有人能告诉我为什么这两种匿名类型不一样吗

{Name = "<>f__AnonymousType0`6" FullName = "<>f__AnonymousType0`6[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Decimal, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}

{Name = "<>f__AnonymousType0#1`6" FullName = "<>f__AnonymousType0#1`6[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Decimal, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}
{Name=“f_uanonymoustype0`6”FullName=“f_uanonymoustype0`6[[System.String,mscorlib,Version=4.0.0.0,Culture=中立,PublicKeyToken=b77a561934e089],[System.String,mscorlib,Version=4.0.0.0.0,Culture=中立,PublicKeyToken=b77a561934e089],[System.Int32,mscorlib,版本=4.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089],[System.Decimal,mscorlib,版本=4.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089],[System.Double,mscorlib,版本=4.0.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089]。]
{Name=“f_uAnonymousType0#1`6”FullName=“f_uAnonymousType0#1`6[[System.String,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089],[System.String,mscorlib,Version=4.0.0.0.0,Culture=neutral,KeyToken=B77A5619B89],[System.String,mscorlib,mscorlib,Version=4.0.0,Culture=neutral,KeyToken=B77A5619B89],[System.Int32,mscorlib,版本=4.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089],[System.Decimal,mscorlib,版本=4.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089],[System.Double,mscorlib,版本=4.0.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089]。]
澄清:(我不知道这是否重要,但一个匿名类型有一个#符号。哦,#01)

我有这两段代码。在同一个类(程序集)中。一个返回上面的一个匿名类型,另一个返回另一个。但是,两个都在计算同一个表达式

我做了下面的比较(有些只是为了查看结果,尽管有些应该正确返回false)。但是,它们都返回false。(我可能遗漏了一些我尝试过的)

ms返回一个匿名类型。 resultOfSelect返回另一个匿名类型

注意:第二段代码中的methodArgumentStringContainingSelectStatement包含与字符串相同的表达式


'ms==resultOfSelect'

'ms.GetType()==resultOfSelect'

'ms.GetType().Equals(resultOfSelect.GetType())'

'ms.GetType()==resultOfSelect.GetType()'

还有其他的,都是假的 结果选择调试视图为:

{Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable}

ms debugView是:

{Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable}

第一项声明:

   ' var ms =     (instanceContainingSelectMethod as IQueryable<Emar>).Select( nextEmarClassInstanceFromPreviousSelectMany => new { Schedule = nextEmarClassInstanceFromPreviousSelectMany.BEmem.Category.Substring(0, 1), Category = "0" + nextEmarClassInstanceFromPreviousSelectMany.BEmem.Category.Substring(1), Description = "", Year = nextEmarClassInstanceFromPreviousSelectMany.Month.Year, Time = nextEmarClassInstanceFromPreviousSelectMany.Actual_Time, Units = ((nextEmarClassInstanceFromPreviousSelectMany.BEmem.PurchDate ?? nextEmarClassInstanceFromPreviousSelectMany.BEmem.InServiceDate).Value.Year == nextEmarClassInstanceFromPreviousSelectMany.Month.Year)
? (nextEmarClassInstanceFromPreviousSelectMany.BEmem.SoldDate != null)
    ? (nextEmarClassInstanceFromPreviousSelectMany.BEmem.SoldDate.Value.Year == nextEmarClassInstanceFromPreviousSelectMany.Month.Year)
        ? (((12d - ((double)((nextEmarClassInstanceFromPreviousSelectMany.BEmem.PurchDate != null)
            ? (System.DateTime?)nextEmarClassInstanceFromPreviousSelectMany.BEmem.PurchDate.Value
            : nextEmarClassInstanceFromPreviousSelectMany.BEmem.InServiceDate).Value.Month)) + 1d) - (12d - ((12d - ((double)nextEmarClassInstanceFromPreviousSelectMany.BEmem.SoldDate.Value.Month)) + 1d))) / 12d
        : ((12d - ((double)(nextEmarClassInstanceFromPreviousSelectMany.BEmem.PurchDate ?? nextEmarClassInstanceFromPreviousSelectMany.BEmem.InServiceDate).Value.Month)) + 1d) / 12d
    : ((12d - ((double)(nextEmarClassInstanceFromPreviousSelectMany.BEmem.PurchDate ?? nextEmarClassInstanceFromPreviousSelectMany.BEmem.InServiceDate).Value.Month)) + 1d) / 12d
: (nextEmarClassInstanceFromPreviousSelectMany.BEmem.SoldDate != null)
    ? (nextEmarClassInstanceFromPreviousSelectMany.BEmem.SoldDate.Value.Year == nextEmarClassInstanceFromPreviousSelectMany.Month.Year)
        ? (12d - ((12d - ((double)nextEmarClassInstanceFromPreviousSelectMany.BEmem.SoldDate.Value.Month)) + 1d)) / 12d
        : 1d
    : 1d } );'
            'Func<IQueryable<Emar>, object> customSelectManyDelegate =

           await CSharpScript
             .EvaluateAsync<Func<IQueryable<Emar>, object>>(methodArgumentStringContainingSelectStatement, options);

         resultOfSelect =  customSelectManyDelegate(instanceContainingSelectMethod as IQueryable<Emar>);'
'var ms=(instanceContainingSelectMethod为IQueryable)。选择(NexterMassInstanceFromPreviousSelectMany=>new{Schedule=NexterMassInstanceFromPreviousSelectMany.BEmem.Category.Substring(0,1),Category=“0”+NexterMassInstanceFromPreviousSelectMany.BEmem.Category.Substring(1),Description=“”,Year=nexterClassInstanceFromPreviousSelectMany.Month.Year,Time=nexterClassInstanceFromPreviousSelectMany.Actual_时间,单位=((nexterClassInstanceFromPreviousSelectMany.BEmem.purchate??nexterClassInstanceFromPreviousSelectMany.BEmem.InServiceDate)Value.Year==nexterClassInstanceFromPreviousSelectMany.Month.Year)
?(nextEmarClassInstanceFromPreviousSelectMany.BEmem.SoldDate!=null)
?(nextEmarClassInstanceFromPreviousSelectMany.BEmem.SoldDate.Value.Year==nextEmarClassInstanceFromPreviousSelectMany.Month.Year)
((12d-((双精度)((nexterMarcClassInstanceFromPreviousSelectMany.BEmem.PurchDate!=null)
?(System.DateTime?)下一个MarcClassInstancefromPreviousSelectMany.BEmem.purcDate.Value
:nexterMarcClassInstanceFromPreviousSelectMany.BEmem.InServiceDate).Value.Month))+1d-(12d-((12d-((双)nexterMarcClassInstanceFromPreviousSelectMany.BEmem.SoldDate.Value.Month))+1d))/12d
:((12d-((双精度)(nexterMarcClassInstanceFromPreviousSelectMany.BEmem.purchate??nexterMarcClassInstanceFromPreviousSelectMany.BEmem.InServiceDate)。Value.Month))+1d)/12d
:((12d-((双精度)(nexterMarcClassInstanceFromPreviousSelectMany.BEmem.purchate??nexterMarcClassInstanceFromPreviousSelectMany.BEmem.InServiceDate)。Value.Month))+1d)/12d
:(nextEmarClassInstanceFromPreviousSelectMany.BEmem.SoldDate!=null)
?(nextEmarClassInstanceFromPreviousSelectMany.BEmem.SoldDate.Value.Year==nextEmarClassInstanceFromPreviousSelectMany.Month.Year)
?(12d-((12d-((双)下一个ArcClassInstancefromPreviousSelectMany.BEmem.SoldDate.Value.Month))+1d)/12d
:1d
:1d});'
第二项声明:

   ' var ms =     (instanceContainingSelectMethod as IQueryable<Emar>).Select( nextEmarClassInstanceFromPreviousSelectMany => new { Schedule = nextEmarClassInstanceFromPreviousSelectMany.BEmem.Category.Substring(0, 1), Category = "0" + nextEmarClassInstanceFromPreviousSelectMany.BEmem.Category.Substring(1), Description = "", Year = nextEmarClassInstanceFromPreviousSelectMany.Month.Year, Time = nextEmarClassInstanceFromPreviousSelectMany.Actual_Time, Units = ((nextEmarClassInstanceFromPreviousSelectMany.BEmem.PurchDate ?? nextEmarClassInstanceFromPreviousSelectMany.BEmem.InServiceDate).Value.Year == nextEmarClassInstanceFromPreviousSelectMany.Month.Year)
? (nextEmarClassInstanceFromPreviousSelectMany.BEmem.SoldDate != null)
    ? (nextEmarClassInstanceFromPreviousSelectMany.BEmem.SoldDate.Value.Year == nextEmarClassInstanceFromPreviousSelectMany.Month.Year)
        ? (((12d - ((double)((nextEmarClassInstanceFromPreviousSelectMany.BEmem.PurchDate != null)
            ? (System.DateTime?)nextEmarClassInstanceFromPreviousSelectMany.BEmem.PurchDate.Value
            : nextEmarClassInstanceFromPreviousSelectMany.BEmem.InServiceDate).Value.Month)) + 1d) - (12d - ((12d - ((double)nextEmarClassInstanceFromPreviousSelectMany.BEmem.SoldDate.Value.Month)) + 1d))) / 12d
        : ((12d - ((double)(nextEmarClassInstanceFromPreviousSelectMany.BEmem.PurchDate ?? nextEmarClassInstanceFromPreviousSelectMany.BEmem.InServiceDate).Value.Month)) + 1d) / 12d
    : ((12d - ((double)(nextEmarClassInstanceFromPreviousSelectMany.BEmem.PurchDate ?? nextEmarClassInstanceFromPreviousSelectMany.BEmem.InServiceDate).Value.Month)) + 1d) / 12d
: (nextEmarClassInstanceFromPreviousSelectMany.BEmem.SoldDate != null)
    ? (nextEmarClassInstanceFromPreviousSelectMany.BEmem.SoldDate.Value.Year == nextEmarClassInstanceFromPreviousSelectMany.Month.Year)
        ? (12d - ((12d - ((double)nextEmarClassInstanceFromPreviousSelectMany.BEmem.SoldDate.Value.Month)) + 1d)) / 12d
        : 1d
    : 1d } );'
            'Func<IQueryable<Emar>, object> customSelectManyDelegate =

           await CSharpScript
             .EvaluateAsync<Func<IQueryable<Emar>, object>>(methodArgumentStringContainingSelectStatement, options);

         resultOfSelect =  customSelectManyDelegate(instanceContainingSelectMethod as IQueryable<Emar>);'
“Func customSelectManyDelegate=
等待CSharpScript
.EvaluateSync(methodArgumentStringContainingSelectStatement,options);
resultOfSelect=customSelectManyDelegate(instancecontainingselectmethodasiqueryable);'

匿名类型实际上只能在单个方法的上下文中使用,或者可能在某些反射场景中使用,其中形状很重要,而不是类型

因此:询问类型为何不同已经破坏了语言功能的意图。至于它们为何不同:可能是不同的程序集或模块。这尤其适用于视图编译晚于主代码的web项目

但是:基本上,不要依赖于这种平等性。这不是保证。如果您关心类型是什么(以及它等于什么),那么您的选择包括:

  • 声明自己的正式类型,并使用它-最佳选择
  • 使用值元组(
    ValueTuple
    ,但具有一流的语言支持,包括从被调用方传播到调用方,但不从调用方传播到被调用方的伪名称)
  • 使用元组(
    Tuple

使用匿名类型实际上不会出现在列表中。

匿名类型实际上只用于单个方法的上下文中,或者可能用于某些仅形状而非类型重要的反射场景中

所以:阿斯金