是否可以使用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);
}
}