【问题标题】:Could not evaluate expression - Linq Query just returning null无法评估表达式 - Linq Query 只返回 null
【发布时间】:2015-08-25 16:54:22
【问题描述】:

我真的不确定这里发生了什么。我目前正在我的 Web Api 中处理一些操作,其中之一涉及使用标识符检查我的数据库中是否存在联系人,然后检索联系人(如果存在)。

所以我有我的表达方式:

var contact = context.Contacts.Where(x => x.UniqueId == Identifier).FirstOrDefault();

if (contact == null) { return "Identifier not recognised. Check correct type and Identifier"; }

//Goes on to perform tasks with contact information.

然后它继续......但这是它表现奇怪的地方。

原始的 linq 查询完全没有做任何事情。它没有检索联系人供以后使用,甚至也没有注册为 null 来触发返回消息。

在我的调试控制台中,联系人字段只是灰显(可见,具有空值,但无法单击),当我点击值列中的刷新按钮时,它说

无法计算表达式

这可能是什么原因?我的其他访问同一个数据库的 API 服务工作得很好,就是这一行。

可能相关的事实

  • 在我使用的两个命名空间中,两个名为“contact”的实体之间存在类型冲突。我不会认为这很重要。铸造并没有解决它。只是想我会提到它。

【问题讨论】:

  • 您的代码中的Identifier 是什么?是局部变量吗?
  • 另外,仅供参考,您可以将代码重构为context.Contacts.FirstOrDefault(x => x.UniqueId == Identifier)。这是假设 Identifier 是与您的 UniqueId 类型相同的本地或全局变量
  • 您很可能在contact 变量“超出范围”的上下文中进行调试,因此它不再存在。你是不是正好在检查if (contact == null)的那条线上?
  • FirstOrDefault 在没有找到任何东西时并不总是/不必返回null。它将始终使用该类型的 default 值。对于null 的复杂类型/类。但是对于int,它会是0。为了安全起见,你应该用== default(Contact) 替换你的== null 检查。此外,如果您有冲突的类型,则根本不应该编译。见this
  • @AlexPavlov 谢谢,会的。标识符是从内部的 POST 方法读取的局部变量。调试显示 Identifier 应该是这样的。

标签: c# linq


【解决方案1】:

我在上面的 cmets 中建议了一些更改,并且还明确定义了联系人,现在它可以很好地从数据库中加载联系人。我真的很困惑为什么它基本上只是重构,但以下是有效的:

namespace.Models.Contact contact = context.Contacts.FirstOrDefault(x => x.UniqueId == Identifier);

//If Identifier isn't recognised return.
if (contact == default(namespace.Models.Contact)) 
{ 
     return "Identifier not recognised. Check correct type and Identifier"; 
}

这个工作代码在功能上与我的问题中发布的代码没有什么不同这一事实让我感到困惑。我想这一定是我的 VS 正在做的事情。

cmets 中的 Alex Pavlov 指向https://weblog.west-wind.com/posts/2013/Nov/21/Visual-Studio-2013-Could-not-evaluate-Expression-Debugger-Abnormality

这段代码非常好,如果只是表现奇怪的话,我可能会通过重新启动 VS 来修复它。

【讨论】:

  • 我之所以询问你的 Visual Studio 版本是因为我偶然发现了this article。另外,您确实提到您的Contact 课程含糊不清,这确实很重要。通过指定它所属的命名空间 - 你可能已经解决了这个问题。
  • 谢谢!这很有趣。我找不到匹配的示例。解决歧义是我唯一需要注意的事情(除了重新启动 VS),所以这可能是解决方案。不过很奇怪!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多