带有谓词的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.但这并不意味着两个查询都不会被数据库引擎执行.

分析将为您提供答案,即哪种解决方案最快或使用最少的资源.

上一篇:[转]快速的批量修改重命名.net程序的命名空间


下一篇:本地常量变量应以大写还是小写开头