2011-04-26 112 views
1

我有一個稍微模糊的模型,用戶來自Active Directory,但從此信息從SQL數據庫到達。使用實體框架的屬性數據庫查找(計數)

所以,我有一個UserRepository,目前允許用戶從活動目錄搜索其他用戶 - 這將返回一個列表,我綁定到一個網格。

我需要能夠檢查每個用戶是否有任何聯繫人(它們居住在數據庫中),以便更改UI的行爲方式。

你會如何做到這一點?在另一頁上聯繫人將是可編輯的,但在列表中,我只需要知道是否有任何聯繫人。我沒有看到任何干淨的方式來發出一個數據庫調用爲每個結果執行存儲過程來獲取計數,我得到的是計數而不是聯繫人列表,以儘可能簡化它。

我想上線的東西:

/// <summary> 
/// information resides in the database 
/// </summary> 
private int? contactsCount = null; 
public int ContactsCount 
{ 
    get 
    { 
    if (!contactsCount.HasValue) 
     throw new ApplicationException("Error trying to access property ContactsCount before it has been initialised. The underlying repository code needs to handle the retrieval of this info."); 
    return contactsCount.Value; 
    } 
    set { contactsCount = value; } 
} 

,並使用UserRepository尋找每一行後設置ContactsCount的值(使用標準的SQL連接),但是這將是很好的將看到實體框架在實際屬性上的作用,但我不確定如果主用戶對象不是實體模型的一部分,我只能將一個屬性綁定到函數上?

回答

0

它不可能直接與實體框架。我認爲這是一個非常適合你已經擁有的專用UserRepository類。

作爲一個方面說明,我會盡力避免每個用戶一個單獨的數據庫調用,而不是你可以用一個單一的查詢,像這樣的事情解決了這個[警告:未經測試的代碼進取]:

var users = GetUsersFromActiveDirectory(); 


// get the nof contacts per user fill in the contacts count for each user 
// assuming a IsContactFrom property on Contact here, which corresponds to User.UserName 
// also, assuming the number of users this is called for is 'reasonable' 
using (db = new MyObjectContext()) 
{ 
    var userNames = users.Select(u => u.UserName).ToList(); 

    var usersWithContacts = from c in db.Contacts 
          where userNames.Contains(c.IsContactFrom) 
          group by c.IsContactFrom into ContactsPerUser 
          select new 
          { 
           UserName = c.IsContactFrom, 
           NofContacts = ContactsPerUser.Count() 
          }; 

    var dic = usersWithContacts.ToDictionary(u => u.UserName); 

    foreach (var u in users) 
    { 
     u.ContactsCount = usersWithContacts[u.UserName].Count 
    } 




} 
0

我不太確定你在做什麼。如果你有一個聯繫表,被稱爲登錄欄,然後你可以運行沿着這些路線

var qry = from c in ctx.Contacts 
    group c by c.Login 
    into grp 
    select new 
    { 
     Login = grp.Key, 
     Count = grp.Count() 
    }; 

假設你有IEnumerable<User> users,保持用戶的列表,從Active Directory中的東西,然後你可以做到這一點合併結果:

var dictionary = qry.ToDictionary(x => x.Login); 
users.Foreach(x=> x.ContactsCount = dictionary.ContainsKey(x.Login) ? dictionary[x.Login].Count : 0); 

這裏假設你已經在你的用戶類,其中的foreach這樣定義(即我發現自己使用相當頻繁的擴展方法)定義ContactsCount屬性:

public static void Foreach<T>(this IEnumerable<T> enumerable, Action<T> action) 
{ 
    foreach (T value in enumerable) 
    { 
     action(value); 
    } 
}