动态Linq到数据表派生字段

时间:2011-06-08 08:18:51

标签: linq dynamic datatable

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

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

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

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

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

var parameters = from d in dt.AsEnumerable()            选择(myCalc);

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

2 个答案:

答案 0 :(得分:0)

您可以使用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();
    }   
}

答案 1 :(得分:0)

这样的事情:

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