2011-04-26 2 views
1

У меня есть слегка неясная модель, в которой пользователи поступают из Active Directory, но с этого момента информация поступает из SQL db.Поиск и поиск базы данных свойств с Entity Framework

Итак, у меня есть UserRepository, который в настоящее время позволяет пользователям искать других пользователей из активного каталога - это возвращает список, который я привязываю к сетке.

Мне нужно проверить, есть ли у каждого пользователя какие-либо контакты (которые живут в db), чтобы изменить поведение UI.

Как вы это сделаете? На другой странице Контакты будут доступны для редактирования, но в списке мне просто нужно знать, есть ли какие-либо Контакты или нет. Я не вижу никакого чистого пути за счет выдачи вызова 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; } 
} 

и используя UserRepository, чтобы установить значение ContactsCount после поиска для каждой строки (с помощью стандартного подключения SQL), но что было бы неплохо было бы чтобы увидеть Entity Framework в действии над фактическим свойством, но я не уверен, что могу привязать только свойство к функции, если основной объект User не является частью модели Entity Model?

ответ

0

Невозможно напрямую с Entity Framework. Я думаю, что это идеально подходит для выделенного класса 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

Я не совсем понимаю, что тебе нужно. Если у вас есть Контактная таблица с, столбец, который называется Login, то вы можете запустить что-то вдоль этих линий

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); 

Это предполагает, что вы ContactsCount свойства, определенные в классе User, где Foreach определяется как это (метод расширения, что я считаю себя, используя довольно часто):

public static void Foreach<T>(this IEnumerable<T> enumerable, Action<T> action) 
{ 
    foreach (T value in enumerable) 
    { 
     action(value); 
    } 
} 
Смежные вопросы