动态Linq到Datatable派生字段



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

选择a、b、a+b作为c来自MyDataTable

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

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

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

var参数=从r到dt。AsEnumerable()选择(myCalc);

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

您可以使用Dictionary、DataReader和Dynamic Queries来实现这一点。这里有一个部分基于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();
    }   
}

类似这样的东西:

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);
    }
}

相关内容

  • 没有找到相关文章

最新更新