【问题标题】:Dynamic Linq to Datatable Derived Field动态 Linq 到数据表派生字段
【发布时间】:2023-03-23 12:34:01
【问题描述】:

是否可以使用 Dynamic Linq 来运行类似于以下内容的查询:

选择 a, b, a + b 作为 c 来自我的数据表

我有一个应用程序,用户可以在其中输入 SQL 语句,然后将这些语句的结果分配给一个 DataTable。还可以选择基于其他字段派生字段。 (例如,用户可以说字段 C = a + b,或字段 D = A*B+10 等)。

理想情况下,我想做类似的事情:

string myCalc = "Convert.ToDouble(r.ItemArray[14])+Convert.ToDouble(r.ItemArray[45])";

var 参数 = from r in dt.AsEnumerable() 选择(我的计算器);

在这个例子中我想要做的是将第 14 列的值添加到第 45 列并返回它。由用户决定使用什么表达式,因此选择中的文本需要来自字符串,我无法对表达式进行硬编码。字符串 myCalc 纯粹用于演示目的。

【问题讨论】:

    标签: linq dynamic datatable


    【解决方案1】:

    您可以使用字典、DataReader 和动态查询来做到这一点。以下是部分基于 Rob Connery 的 Massive ORM RecordToExpando 的示例:

    void Main()
    {
        string connString = "your connection string";
    
        System.Data.SqlClient.SqlConnection conn = new SqlConnection(connString);
        string statement = "SUM = EstimatedEffort + OriginalEstimate, Original = OriginalEstimate";
        // Note: You should parse the statement so it doesn't have any updates or inserts in it.
        string sql = "SELECT " + statement +" FROM Activities";
    
        List<IDictionary<string, object>> results = new List<IDictionary<string, object>>();    
        conn.Open();
    
        using(conn)
        {
            var cmd = new SqlCommand(sql,  conn);
            var reader = cmd.ExecuteReader();
            while (reader.Read())
            {               
                var dic = new Dictionary<string, object>();
                for (int i = 0; i < reader.FieldCount; i++)
                {
                    dic.Add(
                        reader.GetName(i), 
                        DBNull.Value.Equals(reader[i]) ? null : reader[i]);
                }
    
                results.Add(dic);           
            }
        }
    
    
        foreach (var dicRow in results)
        {       
            foreach (string key in dicRow.Keys)
            {
                Console.Write("Key: " + key + " Value: " + dicRow[key]);
            }
    
            Console.WriteLine();
        }   
    }
    

    【讨论】:

      【解决方案2】:

      类似这样的:

      void Main()
      {
          var dataTable = new DataTable();
          dataTable.Columns.Add("a", typeof(double));
          dataTable.Columns.Add("b", typeof(double));
      
          dataTable.Rows.Add(new object[] { 10, 20 });
          dataTable.Rows.Add(new object[] { 30, 40 });
      
          string myCalc = "Convert.ToDouble(ItemArray[0]) + Convert.ToDouble(ItemArray[1])";
      
          var query = dataTable.AsEnumerable().AsQueryable();
          var result = query.Select(myCalc);
      
          foreach (Double c in result)
          {
              System.Console.WriteLine(c);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2012-08-20
        • 1970-01-01
        • 2021-07-20
        • 2015-03-12
        • 2014-06-11
        • 1970-01-01
        • 2012-06-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多