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

时间:2013-02-08 12:11:25

标签: c# linq entity-framework-5

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

始终也会返回最新的

2 个答案:

答案 0 :(得分:2)

怎么样:

var userProfile = context.UserProfiles.Where(up => up.UserId == userId)
                       .OrderByDescending(up => up.IsActive).FirstOrDefault();

答案 1 :(得分:1)

您的第二个OrderByDescending会忽略前一个订单所做的任何排序。您需要使用ThenByDescending代替:

context.UserProfiles
    .Where(up => up.UserId == userId)
    .OrderByDescending(up => up.IsActive)
    .ThenByDescending(up => up.LastUsed)
    .FirstOrDefault();