从where子句或第一个子句返回一个元素
本文关键字:子句 一个 元素 返回 where 第一个 | 更新日期: 2023-09-27 17:58:14
我正试图以以下方式使用实体框架5查询我的数据库:
userProfile = context.UserProfiles.SingleOrDefault(up => up.UserId == userId && up.IsActive);
现在,当存在多个用户配置文件时(由于SingleOrDefault
),这显然会引发异常。
如何构造查询,以便从当前用户(up.UserId == userId
)获得活动用户配置文件,或者在没有活动用户配置文件的情况下获得第一个用户配置文件?
我完全知道如何在两个查询中做到这一点,但我认为这将是太多的开销,并且这应该只需要一个查询就可以实现:
userProfile = context.UserProfiles.Single(up => up.UserId == userId && up.IsActive); // throws exception when not exactly one
if (userProfile == null)
{
userProfile = context.UserProfiles.FirstOrDefault(up => up.UserId == userId);
}
编辑:
我现在使用它作为参数,并且可以完美地使用IsActive
属性:context.UserProfiles.Where(up => up.UserId == userId).OrderByDescending(up => up.IsActive).FirstOrDefault();
现在,当没有IsActive == true
行时,我想按它们的LastUsed
日期订购它们,并选择最近使用的:
context.UserProfiles.Where(up => up.UserId == userId).OrderByDescending(up => up.IsActive).OrderByDescending(up => up.LastUsed).FirstOrDefault();
遗憾的是,这个总是返回最新的,即使有一行包含IsActive == true
怎么样:
var userProfile = context.UserProfiles.Where(up => up.UserId == userId)
.OrderByDescending(up => up.IsActive).FirstOrDefault();
您的第二个OrderByDescending
会忽略前一个执行的任何排序。您需要使用ThenByDescending
:
context.UserProfiles
.Where(up => up.UserId == userId)
.OrderByDescending(up => up.IsActive)
.ThenByDescending(up => up.LastUsed)
.FirstOrDefault();