我有一个相当丑陋的服务工作,它通过遗留数据库运行并将其与我们的生产数据库进行比较:
if (vendorContract.Item.Where(x => x.ItemNumber == contractItem.Item_Number) != null) {
var oldDbContractItem = vendorContract.Item.Where(x => x.ItemNumber == contractItem.Item_Number).First();
// check to see if there were changes
if (oldDbContractItem.DateStamp != vendorContractItem.Date_Stamp)
{
oldDbContractItem.Update(vendorContractItem);
}
}
Run Code Online (Sandbox Code Playgroud)
我会得到一个错误var oldDbContratItem,"序列不包含任何元素",但我只是做了一个!= null检查.这一定很简单,发生了什么?
Eri*_*ert 17
如果我可以教人们关于LINQ的一件事就是:查询表达式的值是表示查询的对象,而不是查询的结果.从根本上说这是你的问题; 您将查询视为其结果.查询不仅仅是餐厅是俱乐部三明治的结果.餐厅是生产俱乐部三明治的设备; 查询是生成结果的设备.
这是针对null你正在做的测试:
vendorContract.Item.Where(x => x.ItemNumber == contractItem.Item_Number) != null
Run Code Online (Sandbox Code Playgroud)
这将永远是真实的; 这将至少返回一个空序列...永远不会null.
你可能有意测试它的长度是否大于0?
然而,有一种更简单的方法,IMO.打电话FirstOrDefault()代替First()并完全省略预测试.然后,测试结果是否FirstOrDefault()为null.
var oldDbContractItem = vendorContract.Item
.Where(x => x.ItemNumber == contractItem.Item_Number).FirstOrDefault();
if(oldDbContractItem != null) //would be null if there are no items
{
// check to see if there were changes
if (oldDbContractItem.DateStamp != vendorContractItem.Date_Stamp)
{
oldDbContractItem.Update(vendorContractItem);
}
}
}
Run Code Online (Sandbox Code Playgroud)