我有一个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()
答案 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";