12

以下是上面提到的方法:

public IList<tst> testUsers()
{
    IList<tst> testUsers = _test.GetAll().ToList();
    return test(test);
}
4

3 回答 3

5

要显示具有位置的用户,我认为您需要一个名为 AdsnapshotUsers 的类

public class AdsnapshotUsers
{
// three fields UserId, UserLogonName, Location

}

现在创建一个返回的方法IList<AdsnapshotUsers>

 public IList<AdsnapshotUsers> GetAdsnapshotUsers()
{
List<User> Users =  GetAcitveUsers().ToList();
List<ADSnapshot> adSnapshotUsers = _adSnapshotRepository.GetAll().ToList();

     return (from u in Users  
         join ad in adSnapshotUsers on u.UserLogonName equals ad.UserLogonName 
         select new AdsnapshotUsers { 
             UserId= u.UserId, UserLogonName = u.UserLogonName, Location = ad.Location
         }
     ).ToList<AdsnapshotUsers>();
}

左外连接以显示用户表中的所有值,即使在 adsnapshot 表中不存在用户登录名(位置值空白)

 (from u in Users 
  join ad in adSnapshotUsers on u.UserLogonName equals ad.UserLogonName into aduserselect
  from ad1 in aduserselect.DefaultIfEmpty() 
  select new AdsnapshotUsers { 
      UserId= u.UserId, UserLogonName = u.UserLogonName, Location = ad1.Location
  }
 ).ToList<AdsnapshotUsers>();

此处将选择用户表中的所有记录,如果用户登录名存在,则位置名称值设置为 ADSnapshot 表值,否则不存在,则设置默认空值。

于 2012-09-13T11:51:54.037 回答
2

在 LINQ 中连接两个 IEnumerable 的最简单方法是使用 Join():

   var joined = from u in GetActiveUsers()
                join ad in _adSnapshotRepository.GetAll()
                    on u.UserLogonName equals ad.UserLogonName
                select new { User = u, Location = ad.Location }

当然,joined 现在是匿名类型的 IEnumerable。如果您在网格视图或需要平面对象的东西中显示此信息,您可能希望使用每个表中所需的属性创建自己的类,然后选择它。

另外两点需要注意:

(1) 您似乎总是提前调用 ToList() 从 IQueryable 转换为 IEnumerable。通过推迟 ToList() 直到您完成所有连接和过滤,您可以让大部分查询发生在 SQL 中(而不是在内存中)。

(2) 通常最好在您的实体上设置关联属性并使用这些属性,而不是加入:

 IQueryable<User> users = ...
 var combinedInfo = users.Select(u => new { User = u, Location = u.ADSnapshot.Location })
    .ToList();
于 2012-09-13T11:39:19.487 回答
0

如果您在这两个表之间存在关系 (1:1),那么您只需使用一个查询就可以非常轻松地获取记录。即使第二个表中不存在记录。

我正在使用上面定义的类定义来存储数据。

_userRepository.GetAll().Select(u=>new AdsnapshotUsers  {
         UserId= u.UserId, 
         UserLogonName = u.UserLogonName, 
         Location = u.ADSnapshot.Location
 }).ToList();
于 2012-09-14T05:15:43.797 回答