带有谓词的LINQ FirstOrDefault(如果找不到)
作者:互联网
我正在尝试在IEnumerable中搜索特定记录(使用谓词).如果该记录不存在,我想返回第一条记录.如果那也不存在,我只想要null.
我目前正在使用
var category = categories.FirstOrDefault(
c => c.Category == "C") ??
category.FirstOrDefault();
ReSharper给我警告(可能为IEnumerable的多个枚举).该警告告诉我我的sql语句可能执行了两次.一次尝试找到“ C”类别,再一次获得第一条记录.如果我先使用category.ToList()将类别转换为List,则警告将消失.但是,如果类别包含很多记录,那可能会很慢.
有没有更优雅的方法可以做到这一点?还是我应该忽略警告?
解决方法:
ReSharper警告更多是一条消息,上面写着“思考您在做什么”,而不是“您做错了”.
您的解决方案不是那么糟糕,但这取决于情况.
在生产中,该类别将不多久出现一次?这是一种罕见的情况,然后保留您的代码不变.
要考虑的另一件事是执行此代码的频率.是一天一次还是每秒十次?
更像第一个吗?保持原样.
否则,微优化可能会受益.像Seyana这样的解决方案可能会起作用,或者您可以使用Take(1)将查询重写为union(),因此只有一个查询将被发送到SQL Server.但这并不意味着两个查询都不会被数据库引擎执行.
分析将为您提供答案,即哪种解决方案最快或使用最少的资源.
标签:resharper,linq,c 来源: https://codeday.me/bug/20191122/2059341.html