【问题标题】:User-Defined Join of two DataTables两个数据表的用户定义连接
【发布时间】:2016-11-23 15:44:25
【问题描述】:

我创建了一个应用程序,用户可以在其中指定对数据库的查询,甚至可能是不同的数据库。他们希望能够根据用户指定的条件将两个查询结果(存储在 DataTables 中)连接在一起。

用户在 XML 设置文件中指定连接条件,如下所示:

<Join Name="join_example" TableAName="tbl_example1" TableBName="tbl_example2" Expression="a.ID == b.ID" />

到目前为止,我已将 DataTables 转换为动态列表,因此列名现在是属性,但在尝试使用这些属性创建 DynamicExpression 时出现以下错误:

{"类型'List`1'中不存在属性或字段'ID'"}

有什么想法可以创建动态表达式吗?我对执行连接的其他方式持开放态度,但希望用户能够使用 XML 中指定的语法。这是我产生错误的代码。

List<dynamic> TableA = ToDynamicList(DataTableA);
List<dynamic> TableB = ToDynamicList(DataTableB);
ParameterExpression paramA = System.Linq.Expressions.Expression.Parameter(TableA.GetType(), "a");
ParameterExpression paramB = System.Linq.Expressions.Expression.Parameter(TableB.GetType(), "b");
Expression Exp = System.Linq.Dynamic.DynamicExpression.Parse(new ParameterExpression[] { paramA, paramB }, TableA.GetType(), this.Expression, new List<dynamic>[] { TableA, TableB });

【问题讨论】:

    标签: c# linq join dynamic datatable


    【解决方案1】:

    您不需要从表中转换结果,您只需要合并它们。这是一个 linqpad 示例:

    void Main()
    {
        var dt1 = new DataTable();
        dt1.Columns.Add("col1", typeof(string));
        dt1.Columns.Add("col2", typeof(int));
    
    
        var dt2 = new DataTable();
        dt2.Columns.Add("col1", typeof(string));
        dt2.Columns.Add("col2", typeof(int));
    
        var row = dt1.NewRow();
        row["col1"] = "one";
        row["col2"] = 1;
        dt1.Rows.Add(row);
    
        row = dt1.NewRow();
        row["col1"] = "two";
        row["col2"] = 2;
        dt1.Rows.Add(row);
    
        row = dt2.NewRow();
        row["col1"] = "three";
        row["col2"] = 3;
        dt2.Rows.Add(row);
    
        row = dt2.NewRow();
        row["col1"] = "four";
        row["col2"] = 4;
        dt2.Rows.Add(row);
    
    
        var dtMerged = dt1.AsEnumerable().CopyToDataTable();    // Note: CopyToDataTable requirs that there are rows.  must trap for empty table
        dtMerged.Merge(dt2.AsEnumerable().CopyToDataTable(), true, MissingSchemaAction.Add);
    
        dtMerged.Dump();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      相关资源
      最近更新 更多