C# 确定null或计数0的最佳方法
我有一个iQueryable,我需要知道它是null还是没有值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<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";