2

我正在尝试以以下方式使用 Entity Framework 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

4

2 回答 2

2

怎么样:

var userProfile = context.UserProfiles.Where(up => up.UserId == userId)
                       .OrderByDescending(up => up.IsActive).FirstOrDefault();
于 2013-02-08T12:21:46.277 回答
1

您的第二个OrderByDescending忽略前一个所做的任何排序。您需要ThenByDescending改用:

context.UserProfiles
    .Where(up => up.UserId == userId)
    .OrderByDescending(up => up.IsActive)
    .ThenByDescending(up => up.LastUsed)
    .FirstOrDefault();
于 2013-02-08T12:37:26.310 回答