属性数据库查找(计数)与实体框架



我有一个稍微模糊的模型,其中用户来自活动目录,但从那时起,信息从SQL数据库到达。

所以,我有一个UserRepository,目前允许用户从活动目录中搜索其他用户-这返回一个列表,我绑定到一个网格。

我需要能够检查每个用户是否有任何联系人(住在数据库),以改变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连接),但是什么会很好是看到实体框架在实际的属性上的行动,但我不确定我可以绑定只是一个属性到一个函数,如果主要的用户对象不是实体模型的一部分?

直接使用实体框架是不可能的。我认为这是一个完美的适合一个专用的UserRepository类,你已经有了。

作为旁注,我会尽量避免对每个用户进行单独的db调用,相反,你可以用单个查询来解决这个问题,就像这样[warning: untesting code ahead]:

 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
     }


 }

我不太清楚你在找什么。如果您有一个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);

这假设您在用户类上定义了ContactsCount属性,其中Foreach是这样定义的(我发现自己经常使用的扩展方法):

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

相关内容

  • 没有找到相关文章

最新更新