确定null或计数0的最佳方法

时间:2012-02-23 14:20:06

标签: c# linq

我有一个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()

的东西

4 个答案:

答案 0 :(得分:5)

建议您使用.Any()

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

答案 1 :(得分:3)

L是否需要IQueryable&lt;&gt; ?
通过使用SingleOrDefault(),它将是一个人(Person?)或null(假设人是一个类)

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,
艾伦。

答案 2 :(得分:1)

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实现,那么您的假设就会成立。

答案 3 :(得分:1)

使用.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";