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