Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确定null或计数0的最佳方法_C#_Linq - Fatal编程技术网

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

C# 确定null或计数0的最佳方法,c#,linq,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 {

我有一个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";
}
IQueryable L=(来自人的p
其中p.lastname.包含(“y”)
选择p);
如果(L!=null&&L.Count()>0){
返回“某物”;
}否则{
返回“无”;
}

如果您使用
L.Count()
它将使用更多的资源。有更好的办法吗?不使用
L.Count()
的内容建议您使用
.Any()

IQueryable L=(来自人的p
其中p.lastname.包含(“y”)
选择p);
if(L.Any()){
返回“某物”;
}否则{
返回“无”;
}
L.Any()
L.FirstOrDefault()
几乎都具有相同的性能,因为它们具有几乎相同的实现,并且可能是您想要的。您的SingleOrDefault可能是无意的,因为如果有多个结果,它将抛出异常

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


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

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

我需要有资格吗
通过使用SingleOrDefault(),它将是一个人(Person?)或null(假定people是一个类)

其他:SingleOrDefault()是您想要使用的吗?您是指FirstOrDefault()还是指Any()

也许我能帮上忙

hth,

艾伦。

如果你调用
SingleOrDefault
,那么
L
怎么能成为
IQueryable
?你是对的,我的代码中没有
.SingleOrDefault
。请在脑海中编辑。您可以通过单击问题下方的链接来编辑您的问题。我们进行了代码比较和
。Count
vs
。任何
几乎都是相同的。但是我更喜欢
。任何
。我还没有检查SQL是如何处理它的,但我可以稍后再检查。谢谢如果可枚举项为空或只有一个或两个值,或者该方法直接应用于源IEnumerable,该源IEnumerable也可识别为ICollection或数组(因此具有Count或Length属性),则Count()的性能将与任何()大致相同。任何()真正闪耀的地方都是在长系列中;Any()持续执行(O(1)),而Count()线性执行(O(N))。用大多数算法衡量,两者都是“快”的,但Any()更快。Linq to SQL、Entity Framework和最新的NHibernate提供程序都以一种特殊、高效的方式处理
Any
。您可以看到一个使用LINQPad生成的示例。很酷。
      return sis.Students.Any(p => p.LastName.Contains("y")) ? 
        people.Where(p => p.lastname.Contains("y")) : "nothing";
var result = (from p in people  
              where p.lastname.Contains("y")  
              select p).SingleOrDefault(); 

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