哪个更好地检查null类型或在LINQ中使用Any()?

时间:2016-04-19 06:12:26

标签: c# entity-framework linq linq-to-sql linq-to-entities

我有这两个代码,我必须知道哪个更好用。 我认为这是一样的。 如果我没有弄错,第一个只有一次调用数据库,但是, 我不知道检查repo!= null是否正确。

(1)

var repo = Repository
  .Query()
  .Where(ur => ur.CustomerId == customerId)
  .SingleOrDefault();

if (repo != null)
{
    // Update repo
    repo.Name = "name here";
}
else
{
    // code
}

(2)

var repo = Repository
  .Query()
  .Any(ur => ur.CustomerId == customerId);

if (repo)
{
    var result = Repository
      .Query()
      .Where(ur => ur.CustomerId == customerId)
      .Single();

    result.Name = "name here";
}
else
{
    // code
}

2 个答案:

答案 0 :(得分:6)

第二个选项找到一个元素两次。在这里

Repository
  .Query()
  .Any(ur => ur.CustomerId == customerId)

在这里

Repository
  .Query()
  .Where(ur => ur.CustomerId == customerId)
  .Single()

第一个选项只发现一次。这是选择第一个选项的原因。 而且,您可以更好地使用此代码:

var repo = Repository
  .Query()
  .Where(ur => ur.CustomerId == customerId)
  .SingleOrDefault();

只需写下

var repo = Repository
  .Query()
  .SingleOrDefault(ur => ur.CustomerId == customerId);

以及对未来的建议:如果要检查事实您在查询中是否有任何元素,请使用Any(),但不需要元件。

答案 1 :(得分:0)

在第二种方法中,您首先通过Any项目浏览项目以查找匹配项,然后再次获取匹配项目。 SingleOrDefault将在一步中执行任务并检查一个项目(以确定其是否为空)比导航所有项目便宜得多。
所以我认为第一种方法更快更好。