我有一个稍微模糊的模型,其中用户来自活动目录,但从那时起,信息从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);
}
}