【发布时间】: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 应该是这样的。