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();