【问题标题】:Best way to determined null or count 0确定 null 或计数 0 的最佳方法
【发布时间】:2012-03-13 23:05:13
【问题描述】:

我有一个 iQueryable,我需要知道它是 null 还是没有值。

IQueryable<people> L = (from p in people 
                        where p.lastname.Contains("y") 
                        select p);
if (L != null && L.Count() > 0) {
   return "Something";
} else {
   return "NOTHING";
}

如果您使用L.Count(),它将使用更多资源。有没有更好的办法?不使用L.Count()的东西@

【问题讨论】:

  • 如果你打电话给SingleOrDefaultL怎么可能是IQueryable&lt;people&gt;
  • 你是对的,我的代码中没有.SingleOrDefault。请在你的脑海中编辑它。
  • 您可以通过点击问题下方的edit 链接来编辑您的问题。

标签: c# linq


【解决方案1】:

建议您使用.Any()

IQueryable<people> L = (from p in people 
                        where p.lastname.Contains("y") 
                        select p);
if (L.Any()) {
   return "Something";
} else {
   return "NOTHING";
}

【讨论】:

  • 我们进行了代码比较,.Count.Any 几乎相同。但我更喜欢.Any。我还没有检查 SQL 如何处理它,但我可以稍后再做。谢谢!
  • 在 enumerable 为空或只有一个或两个值的情况下,或者该方法直接应用于也可识别为 ICollection 或 Array 的源 IEnumerable(因此具有Count 或 Length 属性),Count() 的执行与 Any() 大致相同。 Any() 真正闪耀的地方在于长集合; Any() 持续执行 (O(1)),而 Count() 线性执行 (O(N))。大多数算法衡量两者都“快”,但 Any() 更快。
  • Linq to SQL、实体框架和最近的 NHibernate 提供程序都以一种特殊的高性能方式处理 Any。您可以查看使用 LINQPad 生成的示例。很酷。
【解决方案2】:

L 需要是 IQueryable 吗?
通过使用 SingleOrDefault() 它将是一个人(Person?)或 null(假设 people 是一个类)

var result = (from p in people  
              where p.lastname.Contains("y")  
              select p).SingleOrDefault(); 

return result == null
        ? "NOTHING"
        : "Something";

其他: 你想使用 SingleOrDefault() 还是你的意思是 FirstOrDefault() 还是 Any()?

也许LINQ: When to use SingleOrDefault vs. FirstOrDefault() with filtering criteria 可以提供帮助。

hth,
艾伦。

【讨论】:

    【解决方案3】:

    使用 .Any 方法的示例

    return people.Any(p => p.lastname.Contains("y")) ? "something" : "nothing";
    

    如果 .Any 返回 true,这是一个返回 IQueryable 的示例,但它可能效率太低,因为它需要两次往返数据库。如果有足够的时间和思考,我相信可以写出更好的方法。

          return sis.Students.Any(p => p.LastName.Contains("y")) ? 
            people.Where(p => p.lastname.Contains("y")) : "nothing";
    

    【讨论】:

      【解决方案4】:

      L.Any()L.FirstOrDefault() 几乎都具有相同的性能,因为它们具有几乎相同的实现,并且可能是您正在寻找的。您的 SingleOrDefault 可能是无意的,因为如果有多个结果,它将引发异常。

      Performance of LINQ Any vs FirstOrDefault != null

      值得一提的是,其中一些取决于您的提供商。 IQueryable 只是暗示一个意图。如果它是 Linq2Sql 或其他东西,那么是 L.Count() 将请求更多资源 - 除了你还在上面的行中调用 SingleOrDefault 这意味着你的空检查是你所需要的,但你的类型不匹配......

      如果我针对 Linq 提供商运行此语句,我会自己编写(或 Amazons,或任何其他给定的 LINQ 提供商).Count() 可能会更快,具体取决于提供商正在做什么,但是如果您使用的是通常的 Microsoft Linq to SQL 实现,则您的假设成立。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-30
        • 2010-09-08
        • 1970-01-01
        相关资源
        最近更新 更多