2011-04-26 6 views
1

ユーザーはActive Directoryから来ていますが、その後は情報がSQLデータベースから届きます。Entity Frameworkでのプロパティデータベースの参照(カウント)

私は現在、ユーザーがアクティブディレクトリから他のユーザーを検索できるようにUserRepositoryを持っています。これはグリッドにバインドするリストを返します。

UIの動作を変更するために、各ユーザーが連絡先(dbに存在する)を持っているかどうかを確認する必要があります。

どうすればよいですか?別のページで連絡先は編集可能ですが、連絡先があるかどうかを知る必要があります。カウントを取得するためにストアドプロシージャを実行するためのストアドプロシージャを実行するためのdbコールを発行する費用はまったくありません。できるだけ合理化された状態に保つために、コンタクトのリストではなくカウントを取得しています。

私はライン上で何かを考えていた:

/// <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; } 
} 

と(標準SQL接続を使用して)、各行の検索後ContactsCountの値を設定するUserRepositoryを使用しますが、どのようないいだろうことだろう実際のプロパティに対して実際のEntity Frameworkが動作しているのを見ることができますが、メインのUserオブジェクトがEntity Modelの一部でない場合は、単にプロパティをバインドできますか?

答えて

0

Entity Frameworkでは直接使用することはできません。私はこれがあなたがすでに持っている専用のUserRepositoryクラスのための完璧なフィットだと思います。

側の注意点として、私は代わりに使用すると、単一のクエリでこれを解決することができ、ユーザーごとに別々のDB呼び出しを避けるためにしようと、このような何か[警告:先にテストされていないコード]:

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

私はあなたが何をしているのかよくわからない。あなたが持つContactテーブル、ログインと呼ばれる列を持っている場合は、あなたが

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

あなたはActive Directoryからユーザーのリストを保持しますIEnumerable<User> usersを持っていると仮定すると、これらの線に沿って何かを実行することができ、あなたは、これを行うことができます

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

これは、あなたがContactsCountプロパティは、foreachのは、次のように定義されているあなたのUserクラス、(私はかなり頻繁に使用して自分自身を見つける拡張メソッド)で定義されていることを前提としています:

public static void Foreach<T>(this IEnumerable<T> enumerable, Action<T> action) 
{ 
    foreach (T value in enumerable) 
    { 
     action(value); 
    } 
} 
結果をマージします
関連する問題