C# 将其显示在";表1“;桌子
以下是上述方法:C# 将其显示在";表1“;桌子,c#,linq,c#-4.0,linq-to-sql,asp.net-mvc-4,C#,Linq,C# 4.0,Linq To Sql,Asp.net Mvc 4,以下是上述方法: public IList<tst> testUsers() { IList<tst> testUsers = _test.GetAll().ToList(); return test(test); } public IList testUsers() { IList testUsers=_test.GetAll().ToList(); 返回测试(test); } 在LINQ中连接两个IEnumerable的最简单方法是使用join():
public IList<tst> testUsers()
{
IList<tst> testUsers = _test.GetAll().ToList();
return test(test);
}
public IList testUsers()
{
IList testUsers=_test.GetAll().ToList();
返回测试(test);
}
在LINQ中连接两个IEnumerable的最简单方法是使用join():
当然,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();
IQueryable用户=。。。
var combinedInfo=users.Select(u=>new{User=u,Location=u.ADSnapshot.Location})
.ToList();
要显示具有位置的用户,我认为您需要一个名为AdsnapshotUsers的类
public class AdsnapshotUsers
{
// three fields UserId, UserLogonName, Location
}
现在创建一个返回IList的方法
public IList GetAdsnapshotUsers()
{
列表用户=GetAcitveUsers().ToList();
列出adSnapshotUsers=\u adSnapshotRepository.GetAll().ToList();
返回(来自用户中的u)
在u.UserLogonName上加入adSnapshotUsers中的ad等于ad.UserLogonName
选择新的AdsnapshotUsers{
UserId=u.UserId,UserLogonName=u.UserLogonName,Location=ad.Location
}
).ToList();
}
如果adsnapshot表中不存在userlogonname(位置值为空),则左外联接显示用户表中的所有值
(来自用户中的u)
将u.UserLogonName上的adSnapshotUsers中的ad加入aduserselect中等于ad.UserLogonName
从aduserselect.DefaultIfEmpty()中的ad1
选择新的AdsnapshotUsers{
UserId=u.UserId,UserLogonName=u.UserLogonName,Location=ad1.Location
}
).ToList();
在这里,用户表中的所有记录都将被选中,对于位置,如果userlogonname存在,则使用ADSnapshot表值设置位置名称值,否则不存在,则设置默认空值。如果这两个表之间有关系(1:1),则只需一个查询即可轻松获取记录。即使第二个表中没有记录
我使用上面定义的类定义来存储数据
_userRepository.GetAll().Select(u=>new AdsnapshotUsers {
UserId= u.UserId,
UserLogonName = u.UserLogonName,
Location = u.ADSnapshot.Location
}).ToList();
我正在Telrik网格中显示。对于Telerik网格,使用列的属性创建一个类,并选择该类的新实例(而不是匿名类型)。然后,将结果IQueryable传递给Telerik。如果您将所有内容保持为IQueryable,那么Telerik将在SQL中而不是在服务器上的内存中执行所有排序、筛选和分页,而不是返回匿名类型。我认为最好创建自定义类并返回它。添加上述代码行后,我无法执行。我设置了断点。它一次又一次地调用GetAdsnapshotUsers()方法,就像在连续循环中一样。删除断点并执行后,错误消息作为“System.StackOverflowException类型的未处理异常”抛出。工作正常。非常感谢你。伟大的继续…非常感谢..只有一个疑问..假设我需要显示用户表中的所有值,即使adsnapshot表中不存在userlogonname,但它在用户表中(在这种情况下,位置可能为空)…我需要如何修改。再次感谢。要从用户表中选择所有用户,即使Adsnapshot中不存在userlongonname,您需要用户左外部联接。在回答中提到左外联,你甚至得到了很多赞成票——我猜你必须为此感谢乔恩·斯基特@John没有恶意,但是如果你正在使用一个特定的工具(本例中是Telerik),你可能想在你的问题主体中提到这一点。它会影响人们对你的回答。
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>();
}
(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>();
_userRepository.GetAll().Select(u=>new AdsnapshotUsers {
UserId= u.UserId,
UserLogonName = u.UserLogonName,
Location = u.ADSnapshot.Location
}).ToList();