在 C# 中加入 3 个数据表
Join 3 datatables in c#
我有以下 3 个数据-tables:
Table1
--------------------------------
ScheduleID | Name | Details
-----------------------------
1 S1 schedule details
2 S2 schedule details
3 S3 schedule details
4 S4 schedule details
Table2
------------------------------
ScheduleGroupID | ScheduleID
------------------------------
1 1
1 2
1 3
2 4
Table3
-----------------------------------------------
ScheduleGroupID | Description | ScheduleCount
------------------------------------------------
1 Urgent 3
2 Non-urgent 1
Expected Result
---------------------------------------------------------------
ScheduleID | Name | Details | ScheduleGroupID | Description
-------------------------------------------------------------
1 S1 5 1 Urgent(row from table3)
2 S2 5 1 Urgent(row from table3)
3 S3 5 1 Urgent(row from table3)
4 S4 5 2 Non-urgent(from table3)
所以我有三个数据 table 并且想将它们合并为一个 table 以产生上面显示的预期结果。这怎么能在 C# 中完成?我假设我必须使用 LINQ,但没有太多经验。
您可以像这样创建一个 class 如下所示
public class TestClass
{
public int ScheduleID { get; set; }
public string Name { get; set; }
public string Details { get; set; }
public int ScheduleGroupID { get; set; }
public string Description { get; set; }
}
并像这样编写查询
List<TestClass> colection = (from x in db.Table1
join y in db.Table2 on x.ScheduleID equals y.ScheduleID
join z in db.Table3 on y.ScheduleGroupID equals z.ScheduleGroupID
select new CityClass
{
ScheduleID = x.ScheduleID,
Name = x.Name,
Details = x.Details,
ScheduleGroupID = y.ScheduleGroupID,
Description = z.Description
}).ToList();
假设它是 DataTable
你可以 join
这样。
var result = from s in schedule.AsEnumerable()
join sg in schedulegroup.AsEnumerable() on s.Field<int>("ScheduleID") equals sg.Field<int>("ScheduleID")
join g in groups.AsEnumerable() on sg.Field<int>("ScheduleGroupID") equals g.Field<int>("ScheduleGroupID")
select new
{
ScheduleID = s.Field<int>("ScheduleID"),
Name = s.Field<string>("Name"),
Details = s.Field<int>("Details"),
ScheduleGroupID = sg.Field<int>("ScheduleGroupID"),
Description = g.Field<string>("Description")
};
勾选这个Demo
你问的问题是2个部分
首先连接到数据库
正如您所说,您希望避免使用 EnitiyFramework
其他一些选项是
LinqToSql:这将与 EF 非常相似
整个框架的开销
如果你想回到老派,你有数据集
可以配置为比通用 dataset
更有用
甚至更老派SQLCommands and datareaders
获得数据后
那么最好的查询方式就是LinqToObjects
var results = from a in Table1
join b in Table2 on a.ID equals b.ID
join c in Table3 on b.ID2 equals c.ID2
//create a anonymous type or better if you want the results to persist create a normal object
select new{ a.Column1, a.Column2, b.Column1, c.Column1};
如果您无法通过代码完成
例如
//firstly build up a key index to make the matching easier
var t1Dic = new Dictionary<int,DataRow>();
foreach(var row in table1.Rows)
{
t1Dic.Add(row[IDCol],row);
}
var t2Dic = new Dictionary<int,DataRow>();
foreach(var row in table2.Rows)
{
t2Dic.Add(row[IDCol],row);
}
//next run though your linking table and add them to your results table
var results = new DataTable();
foreach(var row in table3.Rows)
{
var r = results.NewRow();
r[YourColumnName1] = t1Dic[row[Id1Col][YourColumnName1];
r[YourColumnName2] = t1Dic[row[Id1Col][YourColumnName2];
r[YourColumnName3] = t2Dic[row[Id2Col][YourColumnName3];
r[YourColumnName4] = t2Dic[row[Id2Col][YourColumnName4];
r[YourColumnName5] = t2Dic[row[Id2Col][YourColumnName5];
}
EF 和 Linq 绝对是最简单的方法
在 table 之间建立直接关系将使程序更容易检索数据。如果使用EF,可以通过写一行来检索结果。
Above tables 可以更改为仅使用 2 tables 。
您可以在 table1 中添加另一列作为 schedulegroupID,这将是 schedulegroup table
的外键
ALTER TABLE dbo.schedule
ADD schedulegroupId INT
ALTER TABLE dbo.schedule
ADD CONSTRAINT FK_scheduleGroup
FOREIGN KEY (schedulegroupId)
REFERENCES scheduleGroup(ID)
这样,table 之间就会有直接关系,这使得编写 SQL 和 LINQ 查询变得更容易。
--SQL Query
SELECT * FROM dbo.schedule s INNER JOIN dbo.scheduleGroup sg ON s.schedulegroupid = sg.ID
//LINQ Query
var query = db.schedules.Include("scheduleGroup").ToList();
下面的代码将显示所需结果的第一行。
Console.WriteLine(query[0].Name.ToString() + "," + query[0].Details.ToString() + "," + query[0].schedulegroupId.Value.ToString() + ","
+ query[0].scheduleGroup.Description.ToString());
我有以下 3 个数据-tables:
Table1
--------------------------------
ScheduleID | Name | Details
-----------------------------
1 S1 schedule details
2 S2 schedule details
3 S3 schedule details
4 S4 schedule details
Table2
------------------------------
ScheduleGroupID | ScheduleID
------------------------------
1 1
1 2
1 3
2 4
Table3
-----------------------------------------------
ScheduleGroupID | Description | ScheduleCount
------------------------------------------------
1 Urgent 3
2 Non-urgent 1
Expected Result
---------------------------------------------------------------
ScheduleID | Name | Details | ScheduleGroupID | Description
-------------------------------------------------------------
1 S1 5 1 Urgent(row from table3)
2 S2 5 1 Urgent(row from table3)
3 S3 5 1 Urgent(row from table3)
4 S4 5 2 Non-urgent(from table3)
所以我有三个数据 table 并且想将它们合并为一个 table 以产生上面显示的预期结果。这怎么能在 C# 中完成?我假设我必须使用 LINQ,但没有太多经验。
您可以像这样创建一个 class 如下所示
public class TestClass
{
public int ScheduleID { get; set; }
public string Name { get; set; }
public string Details { get; set; }
public int ScheduleGroupID { get; set; }
public string Description { get; set; }
}
并像这样编写查询
List<TestClass> colection = (from x in db.Table1
join y in db.Table2 on x.ScheduleID equals y.ScheduleID
join z in db.Table3 on y.ScheduleGroupID equals z.ScheduleGroupID
select new CityClass
{
ScheduleID = x.ScheduleID,
Name = x.Name,
Details = x.Details,
ScheduleGroupID = y.ScheduleGroupID,
Description = z.Description
}).ToList();
假设它是 DataTable
你可以 join
这样。
var result = from s in schedule.AsEnumerable()
join sg in schedulegroup.AsEnumerable() on s.Field<int>("ScheduleID") equals sg.Field<int>("ScheduleID")
join g in groups.AsEnumerable() on sg.Field<int>("ScheduleGroupID") equals g.Field<int>("ScheduleGroupID")
select new
{
ScheduleID = s.Field<int>("ScheduleID"),
Name = s.Field<string>("Name"),
Details = s.Field<int>("Details"),
ScheduleGroupID = sg.Field<int>("ScheduleGroupID"),
Description = g.Field<string>("Description")
};
勾选这个Demo
你问的问题是2个部分
首先连接到数据库
正如您所说,您希望避免使用 EnitiyFramework
其他一些选项是
LinqToSql:这将与 EF 非常相似 整个框架的开销
如果你想回到老派,你有数据集 可以配置为比通用 dataset
更有用
甚至更老派SQLCommands and datareaders
获得数据后
那么最好的查询方式就是LinqToObjects
var results = from a in Table1
join b in Table2 on a.ID equals b.ID
join c in Table3 on b.ID2 equals c.ID2
//create a anonymous type or better if you want the results to persist create a normal object
select new{ a.Column1, a.Column2, b.Column1, c.Column1};
如果您无法通过代码完成 例如
//firstly build up a key index to make the matching easier
var t1Dic = new Dictionary<int,DataRow>();
foreach(var row in table1.Rows)
{
t1Dic.Add(row[IDCol],row);
}
var t2Dic = new Dictionary<int,DataRow>();
foreach(var row in table2.Rows)
{
t2Dic.Add(row[IDCol],row);
}
//next run though your linking table and add them to your results table
var results = new DataTable();
foreach(var row in table3.Rows)
{
var r = results.NewRow();
r[YourColumnName1] = t1Dic[row[Id1Col][YourColumnName1];
r[YourColumnName2] = t1Dic[row[Id1Col][YourColumnName2];
r[YourColumnName3] = t2Dic[row[Id2Col][YourColumnName3];
r[YourColumnName4] = t2Dic[row[Id2Col][YourColumnName4];
r[YourColumnName5] = t2Dic[row[Id2Col][YourColumnName5];
}
EF 和 Linq 绝对是最简单的方法
在 table 之间建立直接关系将使程序更容易检索数据。如果使用EF,可以通过写一行来检索结果。
Above tables 可以更改为仅使用 2 tables 。 您可以在 table1 中添加另一列作为 schedulegroupID,这将是 schedulegroup table
的外键ALTER TABLE dbo.schedule
ADD schedulegroupId INT
ALTER TABLE dbo.schedule
ADD CONSTRAINT FK_scheduleGroup
FOREIGN KEY (schedulegroupId)
REFERENCES scheduleGroup(ID)
这样,table 之间就会有直接关系,这使得编写 SQL 和 LINQ 查询变得更容易。
--SQL Query
SELECT * FROM dbo.schedule s INNER JOIN dbo.scheduleGroup sg ON s.schedulegroupid = sg.ID
//LINQ Query
var query = db.schedules.Include("scheduleGroup").ToList();
下面的代码将显示所需结果的第一行。
Console.WriteLine(query[0].Name.ToString() + "," + query[0].Details.ToString() + "," + query[0].schedulegroupId.Value.ToString() + ","
+ query[0].scheduleGroup.Description.ToString());