Поиск базы данных свойств (количество) с Entity Framework - PullRequest
1 голос
/ 26 апреля 2011

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 26 апреля 2011

Я не совсем уверен, что вы после. Если у вас есть таблица контактов со столбцом, который называется «Логин», то вы можете выполнить что-то вроде этого

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, который хранит список пользователей из активного каталога, вы можете сделать это, чтобы объединить результаты:

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);
    }
}
0 голосов
/ 26 апреля 2011

Это невозможно напрямую с 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
     }




 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...