是否可以使用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纯粹用于演示目的。
答案 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);
}
}