表达式不能包含 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 =&gt; 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&gt; $dte.Debugger.GetExpression("orders.Where(o =&gt; o.IsValid == true)"); 时仍然得到“值:表达式不能包含 lambda 表达式”。唯一的方法是运行 for 循环 PM&gt; 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 表达式的主要内容,如果未能解决你的问题,请参考以下文章

Lambda表达式

Python入门-5函数:07lambda表达式和匿名函数-eval()函数

什么是lambda函数?它有什么好处?

jdk1.7能不能编译lambda表达式

为啥不能为 Java 中的 var 关键字分配 lambda 表达式?

在NetCore上包含包含的Lambda表达式