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