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