使用Entity Framework查找属性数据库(计数)

时间:2011-04-26 10:11:40

标签: entity-framework

我有一个稍微模糊的模型,用户来自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连接),但最好的方法是在实际属性中看到Entity Framework,但我不确定如果主User对象不是实体模型的一部分,可以只将属性绑定到函数?

2 个答案:

答案 0 :(得分: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
     }




 }

答案 1 :(得分:0)

我不太清楚你在追求什么。如果你有一个Contact表,一个名为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来保存活动目录中的用户列表,您可以执行此操作来合并结果:

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

这假设您在User类上定义了ContactsCount属性,其中Foreach的定义如下(我经常使用的扩展方法):

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