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
使用匿名类型实际上不会出现在列表中。匿名类型实际上只用于单个方法的上下文中,或者可能用于某些仅形状而非类型重要的反射场景中 所以:阿斯金