C# 构建按组收集记录的linq查询
场景实际上很简单,但在linq中处理它需要比我更多的经验。。 有三张桌子C# 构建按组收集记录的linq查询,c#,entity-framework,linq,C#,Entity Framework,Linq,场景实际上很简单,但在linq中处理它需要比我更多的经验。。 有三张桌子 Table1 ID Column 1 val1 2 val2 Table2 ID Column 1 val3 2 val4 Table3 ID Column 1 val5 2 val6 我需要这样一个返回的查询 表格结果: Row ID Column Type 1 1 val1 table1 2 2 val2 table1 3 1 val3 table2 4 2
Table1
ID Column
1 val1
2 val2
Table2
ID Column
1 val3
2 val4
Table3
ID Column
1 val5
2 val6
我需要这样一个返回的查询
表格结果:
Row ID Column Type
1 1 val1 table1
2 2 val2 table1
3 1 val3 table2
4 2 val4 table2
5 1 val5 table3
6 2 val6 table3
在网上搜索,并开始如下,但无法计算如何处理技巧创建“类型”,合并记录等
from t1 in table1
join t2 in table2 on t1.id equals t2.id
join t3 in table3 on t1.id equals t3.id
select new {...}
和你最后尝试的一样。查询语法为:
var List = (from t1 in dbContext.table1
join t2 in dbContext.table2 on t1.ID equals t2.ID
join t3 in dbContext.table3 on t1.ID equals t3.ID
select new
{
//t1.DesiredColumnName,
//t2.DesiredColumnName,
//t3.DesiredColumnName,
//so on
}).Distinct().ToList();
和你最后尝试的一样。查询语法为:
var List = (from t1 in dbContext.table1
join t2 in dbContext.table2 on t1.ID equals t2.ID
join t3 in dbContext.table3 on t1.ID equals t3.ID
select new
{
//t1.DesiredColumnName,
//t2.DesiredColumnName,
//t3.DesiredColumnName,
//so on
}).Distinct().ToList();
你已经接受了答案,所以我不知道这是否是你想要的,但它会生成你在帖子中指定的输出 因为您只使用了Id值1和2,所以不清楚您是真的想要执行联接还是仅仅将所有行的集合放入一个结果中 无论如何:
struct TableStructure
{
public int Id { get; set; }
public string Column { get; set; }
}
var t1 = new List<TableStructure>() { new TableStructure { Id = 1, Column = "val1" }, new TableStructure { Id = 2, Column = "val2" } };
var t2 = new List<TableStructure>() { new TableStructure { Id = 1, Column = "val3" }, new TableStructure { Id = 2, Column = "val4" } };
var t3 = new List<TableStructure>() { new TableStructure { Id = 1, Column = "val5" }, new TableStructure { Id = 2, Column = "val6" } };
var result = ((from row1 in t1 select new { row1.Id, row1.Column, SourceTable = "table1" })
.Union(from row2 in t2 select new { row2.Id, row2.Column, SourceTable = "table2" })
.Union(from row3 in t3 select new { row3.Id, row3.Column, SourceTable = "table3" }))
.AsEnumerable().Select((row, index) => new { RowNum = index + 1, row.Id, row.Column, row.SourceTable });
result.ToList().ForEach(row => Console.WriteLine($"{row.RowNum}, {row.Id}, {row.Column}, {row.SourceTable}"));
你已经接受了答案,所以我不知道这是否是你想要的,但它会生成你在帖子中指定的输出 因为您只使用了Id值1和2,所以不清楚您是真的想要执行联接还是仅仅将所有行的集合放入一个结果中 无论如何:
struct TableStructure
{
public int Id { get; set; }
public string Column { get; set; }
}
var t1 = new List<TableStructure>() { new TableStructure { Id = 1, Column = "val1" }, new TableStructure { Id = 2, Column = "val2" } };
var t2 = new List<TableStructure>() { new TableStructure { Id = 1, Column = "val3" }, new TableStructure { Id = 2, Column = "val4" } };
var t3 = new List<TableStructure>() { new TableStructure { Id = 1, Column = "val5" }, new TableStructure { Id = 2, Column = "val6" } };
var result = ((from row1 in t1 select new { row1.Id, row1.Column, SourceTable = "table1" })
.Union(from row2 in t2 select new { row2.Id, row2.Column, SourceTable = "table2" })
.Union(from row3 in t3 select new { row3.Id, row3.Column, SourceTable = "table3" }))
.AsEnumerable().Select((row, index) => new { RowNum = index + 1, row.Id, row.Column, row.SourceTable });
result.ToList().ForEach(row => Console.WriteLine($"{row.RowNum}, {row.Id}, {row.Column}, {row.SourceTable}"));
没关系,伙计。只需使用连接两次。但是值本身重复,检查它。我编辑了文章,我需要合并记录连接。只需重复特定列作为记录计数,对吗?我不明白为什么需要连接。连接表在每个子查询中添加一个额外的“Type”列,但表在origin join中有不同的列,并使用外键对它们进行排列。我的解决方案在这里您不需要连接,但
选择+Concat
这无关紧要。只需使用连接两次。但是值本身重复,检查它。我编辑了文章,我需要合并记录连接。只需重复特定列作为记录计数,对吗?我不明白为什么需要连接。连接表在每个子查询中添加一个额外的“Type”列,但表在原始联接中有不同的列,并使用外键排列它们。我的解决方案在这里看起来您不需要联接,但选择+Concat
bro告诉我如何在列中获取这些“值”数据。。这是唯一返回的空列表。我想要我在中提到的输出post@TyForHelpDude我不知道你的字段名或列名,所以我只写了一条注释,你可以从这里得到其余的。但是如何在这里添加类型column?@TyForHelpDude它很容易返回一个别名作为类型请参阅我的编辑。兄弟,告诉我如何在列中获取这些“值”数据。。这是唯一返回的空列表。我想要我在中提到的输出post@TyForHelpDude我不知道你的字段名或列名,所以我只是在这里放了一条评论,你可以从这里得到其余的。但是如何在这里添加类型列?@TyForHelpDude它很容易返回一个别名作为类型请参阅我的编辑尽快与我们联系。是的,我解决了我的问题,但感谢你的帖子:)是的,我解决了我的问题,但感谢你的帖子:)