Динамическое Linq to Datatable производное поле - PullRequest
2 голосов
/ 08 июня 2011

Можно ли использовать 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 r в dt.AsEnumerable () select (myCalc);

В этом примере я хочу добавить значение столбца 14 к столбцу 45 и вернуть его.Пользователь должен решить, какое выражение использовать, поэтому текст в выделении должен быть из строки, я не могу жестко закодировать выражение.Строка myCalc предназначена исключительно для демонстрационных целей.

Ответы [ 2 ]

0 голосов
/ 30 ноября 2012

Примерно так:

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);
    }
}
0 голосов
/ 13 апреля 2012

Вы можете сделать это, используя словарь, DataReader и динамические запросы.Вот пример, основанный частично на 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();
    }   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...