2011-06-08 93 views
2

是否可以使用動態的LINQ運行類似的查詢:動態LINQ到數據表是導出字段

選擇A,B,A + B爲C 從MyDataTable

我有一個應用程序,其中的用戶可以輸入SQL語句,然後將這些語句的結果分配給DataTable。也可以根據其他字段派生字段。 (例如,用戶可以說字段C = a + b,或者字段D = A * B + 10等)。

理想我想這樣做類似於:

串myCalc = 「Convert.ToDouble(r.ItemArray [14])+ Convert.ToDouble(r.ItemArray [45])」;

var parameters = from r in dt.AsEnumerable() select(myCalc);

我想在這個例子中做的是將列14的值添加到列45並返回它。這取決於用戶決定使用什麼表達式,因此select中的文本需要來自字符串,我無法對錶達式進行硬編碼。字符串myCalc純粹是爲了演示目的。

回答

0

您可以使用字典,DataReader和動態查詢來做到這一點。這是基於在部分羅布·康納利的大規模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(); 
    } 
} 
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); 
    } 
}