2013-02-08 52 views
2

我想查詢我的實體框架5數據庫以下列方式一個元素:返回從WHERE子句或第一個

userProfile = context.UserProfiles.SingleOrDefault(up => up.UserId == userId && up.IsActive);

現在,這顯然會拋出一個異常時,不止一個用戶配置文件存在(由於SingleOrDefault)。

我如何構建我的查詢,所以我得到從當前用戶的活躍 USERPROFILE(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); 
} 

編輯:

我「M現在用這個作爲我的參數,並與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

+6

order by IsActive降序,並取第一個? – 2013-02-08 12:12:55

+0

哦,你說得對 - 當然。這工作。謝謝:) – SeToY 2013-02-08 12:16:44

+0

您需要使用'ThenByDescending'而不是第二個'OrderByDescending' – juharr 2013-02-08 12:41:05

回答

2

如何:

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

謝謝,我可以在兩分鐘內接受答案。你是否也請檢閱我的編輯並發表你對此的看法? :) – SeToY 2013-02-08 12:25:39

+0

@SeToY其中的第二個應該是'ThenByDescending';否則最近不活動的會優先於不活躍的活動。 – 2013-02-08 12:38:11

+0

哦,對。謝謝! :) – SeToY 2013-02-08 12:55:54

1

你的第二個OrderByDescending忽略由前一個完成的任何訂貨。您需要使用ThenByDescending代替:

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