为什么这个if/then语句返回true?

chu*_*nce 2 c# linq

我有一个相当丑陋的服务工作,它通过遗留数据库运行并将其与我们的生产数据库进行比较:

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的一件事就是:查询表达式的值是表示查询的对象,而不是查询的结果.从根本上说这是你的问题; 您将查询视为其结果.查询不仅仅是餐厅是俱乐部三明治的结果.餐厅是生产俱乐部三明治的设备; 查询是生成结果的设备.


And*_*ber 7

这是针对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)