表达式不能包含 lambda 表达式
Posted
技术标签:
【中文标题】表达式不能包含 lambda 表达式【英文标题】:Expression cannot contain lambda expressions 【发布时间】:2014-06-21 15:28:24 【问题描述】:我已获取如下List<>
对象(使用.Include()
):
List<vDetail> entityvDetails =
context.vDetails
.Include("payInstallment.appsDetail")
.Include("payInstallment.appsDetail.application")
.Include("payInstallment.appsDetail.purposes")
.Where(e => e.vch_id == 123).ToList();
然后在前面的代码中,我尝试过滤实体记录,如下所示:
foreach (vDetail item in lstVDetails)
...
int purposeId = entityvDetails.Where(e => e.sad_id == item.sad_id).FirstOrDefault().payInstallment.appsDetail.purposes.prp_id;
...
代码编译完美。但是,运行时返回以下错误(尽管包括所有导航):
Object reference not set to an instance of an object.
所以我设置为使用监视窗口进行调试。现在在观察窗口中分析以下语句:
entityVoucherDetails.Where(e => e.sad_id == item.sad_id).FirstOrDefault()
监视窗口产生以下错误:
。
如果有人可以告诉我可能是什么原因?
【问题讨论】:
FirstOrDefault
明确允许空引用。如果您确定它永远不会为空,请使用First
。在假设某些内容不为空之前,对多行的 nullref 进行更多检查。也将有助于调试。将entityvDetails.Where(e => e.sad_id == item.sad_id).FirstOrDefault()
的结果分配给专用变量。
【参考方案1】:
尚不支持在调试器(监视窗口)中评估 Lambda 表达式。
有一个开放的feature request。
为了调试您的问题,您应该将 lambda 表达式的结果分配给一个专用变量,并在以下语句中使用它。
var entity = entityvDetails.Where(e => e.sad_id == item.sad_id).FirstOrDefault();
2014 年 8 月更新: 微软发布了关于功能请求的更新,宣布他们开始着手处理它:
这就是我们的立场。
1) 我们希望它能够像您一样发挥作用。它不在审核中 - 正在进行中。 2) 我们想出了如何让它工作;它只需要重写所有内容。 3) 我们正在重写所有内容。 4) 重写所有内容需要大量时间和大量测试。
2014 年 11 月更新: 微软最终在 VS2015 中实现了它,但有一些限制。 Read here.
【讨论】:
微软,处理现有语言功能的 IDE 工具被认为是额外的。 Visual Studio 2015 中现在包含对调试 lambda 表达式的支持。干杯。 blogs.msdn.com/b/visualstudioalm/archive/2014/11/12/… @KhadimAli 我有 Visual Studio 2015,现在,在 2017 年,我仍然看到这条消息。我需要切换某种非自动更新或设置标志吗? 我不确定,因为我还没有在 VS2015 中使用它。顺便说一句,您是否尝试过在上面的博客链接中找到的完全相同的简单示例?如果执行,然后尝试通过逐渐使示例复杂以接近您的表达式来隔离问题。最后,您可以在另一个线程上发布您的代码,提供更多详细信息和发现。 问题仍在 VS 2017 上!【参考方案2】:如果您仍需要使用 Visual Studio 2010 或 2013,您可以在包管理器控制台中使用 lambda 表达式。有关详细信息,请在此处查看我的 SO 帖子:
Why is it not possible to evaluate lambdas in the immediate window?
这是original source
【讨论】:
在 Visual Studio 2012 中运行PM> $dte.Debugger.GetExpression("orders.Where(o => o.IsValid == true)");
时仍然得到“值:表达式不能包含 lambda 表达式”。唯一的方法是运行 for 循环 PM> for($i = 0; $i -lt $dte.Debugger.GetExpression("orders.Count()").Value; $i++) $a = $dte.Debugger.GetExpression("orders[$i]"); if ($a.Value.IsValid -eq $true) Write-Host $i ") " $a.Value $a.Value.IsValid
.以上是关于表达式不能包含 lambda 表达式的主要内容,如果未能解决你的问题,请参考以下文章
Python入门-5函数:07lambda表达式和匿名函数-eval()函数