从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

从where子句或第一个子句返回一个元素

怎么样:

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();