以下是上面提到的方法:
public IList<tst> testUsers()
{
IList<tst> testUsers = _test.GetAll().ToList();
return test(test);
}
以下是上面提到的方法:
public IList<tst> testUsers()
{
IList<tst> testUsers = _test.GetAll().ToList();
return test(test);
}
要显示具有位置的用户,我认为您需要一个名为 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 表值,否则不存在,则设置默认空值。
在 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();
如果您在这两个表之间存在关系 (1:1),那么您只需使用一个查询就可以非常轻松地获取记录。即使第二个表中不存在记录。
我正在使用上面定义的类定义来存储数据。
_userRepository.GetAll().Select(u=>new AdsnapshotUsers {
UserId= u.UserId,
UserLogonName = u.UserLogonName,
Location = u.ADSnapshot.Location
}).ToList();