关于c#:确定null或计数0的最佳方法

Best way to determined null or count 0

我有一个IQueryable,我需要知道它是空的还是没有值。

1
2
3
4
5
6
7
8
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()的东西


建议您使用.Any()

1
2
3
4
5
6
7
8
IQueryable<people> L = (from p in people
                        where p.lastname.Contains("y")
                        select p);
if (L.Any()) {
   return"Something";
} else {
   return"NOTHING";
}


我需要可以查询吗?< BR>通过使用singleOrDefault(),它将是一个人(person?)或无效(假定人是一个阶级)

1
2
3
4
5
6
7
var result = (from p in people  
              where p.lastname.Contains("y")  
              select p).SingleOrDefault();

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

其他:singleOrDefault()是您想要使用的吗?您是指firstOrDefault()还是指any()?

也许linq:何时使用singleOrDefault与firstOrDefault()以及筛选条件会有所帮助。

HTH,
艾伦。


使用.any方法的示例

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

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

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

L.Any()L.FirstOrDefault()的性能基本上都与它们的实现几乎相同,而且很可能是您想要的。您的singleOrDefault可能是无意的,因为如果有多个结果,它将抛出一个异常。

Linq Any vs FirstOrDefault的表现!=空

值得一提的是,这其中的一部分取决于您的供应商。iqueryable只是暗示了一个意图。如果它是linq2sql或其他什么,那么yes l.count()将请求更多的资源-除了您在上面的行中也调用singleOrDefault,这意味着您只需要进行空检查,但是您的类型不匹配…

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