C# 将两行转置为一行

C# 将两行转置为一行,c#,sql,linq,C#,Sql,Linq,我正在网格中显示下面的数据 ID Name Address ----------------------------------------- 1 Mike 100, Francis Dr, PA 1 Mike 2, Richmond Street, PA 2 John 45, Francis Dr, PA 2 John 55, Richmond Street, PA 3 Peter 23, C

我正在网格中显示下面的数据

ID     Name   Address
-----------------------------------------
1      Mike     100, Francis Dr, PA
1      Mike      2, Richmond Street, PA
2      John     45, Francis Dr, PA
2      John     55, Richmond Street, PA
3      Peter    23, Castle Street, PA
如何将address2转换为Telerik网格或linq查询中的一个新列,并像这样显示-

ID     Name   Home-Address            Office-Address
------------------------------------------------------------------------------
1      Mike     100, Francis Dr, PA      2, Richmond Street, PA
2      John     45, Francis Dr, PA        55, Richmond Street, PA
3      Peter    23, Castle Street, PA

这向您展示了如何使用Addr1和Addr2,正如上面的评论所说,您无法在呈现数据时知道顺序,因此您无法知道哪些是工作,哪些是家庭

void Main()
{
   List<record> data = new List<record> {
    new record() { ID = 1, Name = "Mike", Address = "100, Francis Dr, PA" },
    new record() { ID = 1, Name = "Mike", Address = "2, Richmond Street, PA" },
    new record() { ID = 2, Name = "John", Address = "45, Francis Dr, PA" },
    new record() { ID = 2, Name = "John", Address = "55, Richmond Street, PA" },
    new record() { ID = 3, Name = "Peter", Address = "23, Castle Street, PA" } };

   var result
     = data.GroupBy((x) => new { ID =x.ID, Name = x.Name })
        .Select((x) => 
           new { ID = x.Key.ID,
                 Name = x.Key.Name,
                 Addr1 = x.Take(1).Select((z) => z.Address).FirstOrDefault(),
                 Addr2 = x.Skip(1).Select((z) => z.Address).FirstOrDefault()});

}

// Define other methods and classes here
public class record
{
   public int ID { get; set; }
   public string Name { get; set; }
   public string Address { get; set; }
}
看起来是这样的:


我假设您的第一个地址是家庭地址,第二个地址是办公地址,还有一个直接表格。在这种情况下,写入一个SP并将其分配给telerik数据源

select t1.ID, t1.Name, t1.Home_Address, t2.Office_Address
(select ID,Name,Address as Home_Address 
from
(select ID,Name,Address,row_number() over (partition by ID Order by ID) rnum
from table_name) a
where a.rnum=1 ) t1 
left join
(select ID,Name,Address as Office_Address from
(select ID,Name,Address,row_number() over (partition by ID Order by ID) rnum
from table_name) b 
where b.rnum=2) t2
on t1.ID=t2.ID 

你怎么知道哪个地址是家里还是办公室?(您不能在关系数据库表中使用顺序。)一旦有了顺序,您可以使用
分组方式
。数据来自哪里?实际上情况不同。我们可以把它看作是地址1和地址1。感谢数据来自MS SQL数据库他没有要求SQL,您的
行号()中缺少
()
,而且您确实想在此处使用
或临时表,因为行号()可能在这两个表之间发生变化--ID不是唯一的。谢谢。我从您的查询中得到了预期的结果。但我们在项目中没有使用SP。我可以使用view,但不能在view中使用此脚本。还有别的办法吗?谢谢Nathan,这个查询在视图中运行得很好。它在窗格条件和图表中显示了一些错误。非常感谢您的解决方案我收到了一个错误-x未声明。我正在使用Vb.net和Linq。对不起,我是vb和linq的新手。谢谢Hogan。准确错误消息-错误319'x'未声明。由于它的保护级别,它可能无法访问。@user1979284-如果您输入了一个错误,上面的代码在LinqPad上编译并运行得很好。如果你看不到拼写错误,请将代码张贴或通过电子邮件发送给我(我个人资料上的电子邮件地址)
select t1.ID, t1.Name, t1.Home_Address, t2.Office_Address
(select ID,Name,Address as Home_Address 
from
(select ID,Name,Address,row_number() over (partition by ID Order by ID) rnum
from table_name) a
where a.rnum=1 ) t1 
left join
(select ID,Name,Address as Office_Address from
(select ID,Name,Address,row_number() over (partition by ID Order by ID) rnum
from table_name) b 
where b.rnum=2) t2
on t1.ID=t2.ID