当前位置: 首页 > 编程语言 > C#

为什么我的linq查询中的值没有立即出现?分享

时间:2023-04-10 11:52:19 C#

为什么我的linq查询中的值没有立即出现?我有一个用于以下块的linq查询来计算报告的某些值。varitems=(fromtransincalclabordb.Sales_Transactionsselecttrans).SelectMany(st=>st.Sales_TransactionLineItems).Where(stli=>stli.TypeID==typeID);十进制测试=items.Where(stli=>stli.Inventory_ItemisBase).Sum(stli=>(decimal?)stli.Inventory_Item.IntExtraServiceAmount)??0;十进制test2=items.Where(stli=>stli.Inventory_ItemisExtra).Sum(stli=>(decimal?)stli.ItemPrice)??0;十进制test3=test+test2;当前.ExtraSales=items.Where(stli=>stli.Inventory_ItemisBase).Sum(stli=>(decimal?)stli.Inventory_Item.IntExtraServiceAmount)??0+items.Where(stli=>stli.Inventory_ItemisExtra).Sum(stli=>(decimal?)stli.ItemPrice)??0;我单步调试了调试器中的代码,发现有些奇怪。分配给test后其值为0。分配给test3后test==11.31test2==11.28和test3==22.59分配给test2后test2==0和test==11.31分配给ExtraSales后ExtraSales==11.31。执行此操作后,ExtraSales的值应为22.59。这里发生了什么?编辑:我在分配给ExtraSales后添加了额外的行,但值没有改变。说这是延迟执行问题的答案是错误的。这是一个运算符优先级问题。摆脱那里完全不相关和不可读的代码。都是红鲱鱼。相关的职责是:十进制?d1=11.31m;十进制?d2=11.28m;十进制test1=d1??0米;十进制test2=d2??0米;十进制test3=test1+test2;十进制test4=d1??0米+d2??0米;最后一行是什么意思?它的意思和前面那行是一样的吗?不它不是。加法运算符的优先级高于空合并运算符,所以这是小数test4=d1??(0m+d2)??0米;您编写的代码表示“如果d1不为空,则生成d1的值。如果d1为空且0m+d2不为空,则生成0m+d2的值。如果0m+d2为空,则生成值0米。”(您可能不知道??运算符具有这种令人愉快的链接属性。通常,a??b??c??d??e为您提供a、b、c或d的第一个非空值,或者e如果它们都是空的。你可以随心所欲地做生成链。这是一个非常优雅的小运算符。)由于d1不为空,我们生成它的值,并且test4被赋予d1的值。你可能想说:十进制test4=(d1??0m)+(d2??0m);如果您的意思是“d1或d2可以为null,如果是,则将null值视为零”。所以12+2是14,12+null是12,null+null是0如果你的意思是“d1和d2都可以是null,如果其中一个是null那么我想要零”那就是十进制test4=(d1+d2)??0米;所以12+2是14,12+null是0,而null+null是0我注意到如果你已经格式化你的代码以便相关文本出现在屏幕上,你可能不会首先得到五个左右的错误答案。尝试格式化代码,使其全部显示在屏幕上;如果你这样做,你会得到更好的答案。我认为您是LINQ延迟执行的“受害者”。看看这篇解释这个概念的博文:http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx是的,它叫做延迟执行,它可以是其中之一非常强大的东西,但如果你不期望它也会绊倒你......以上是C#学习教程:为什么我的linq查询中的值不立即出现?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: