Цикл по запросам LINQ и добавление результатов в DataTable - PullRequest
3 голосов
/ 06 марта 2012

Я пытаюсь использовать цикл для циклического перемещения по массиву, и в каждой итерации выполняю запрос LINQ, используя значение массивов в предложении where.

Затем я хочу последовательно добавить эти результаты.вместе, а затем вернуть результаты в виде таблицы данных.

Как я могу добавить результаты вместе?Я пробовал метод DataTable .Merge (), но получаю сообщение об ошибке («Невозможно неявно преобразовать тип void в DataTable») и не могу понять, как добавить результаты запросов из-за проблем общего определения типов.

РЕДАКТИРОВАТЬ: код ... (или, по крайней мере, одна из версий, которые я пробовал до сих пор)

    DataTable results = new DataTable();

    foreach (string toFind in searchString)
    {

        DataTable toMerge = new DataTable();

        var searchResults = from a in dt.AsEnumerable()
                            where a.Field<string>("A").ToUpper().Contains(toFind.ToUpper())
                            select new
                            {
                                A= a.Field<Int32>("A"),
                                B= a.Field<string>("B"),
                                C= a.Field<string>("C"),
                            };

        toMerge = ConvertDataTable.FromLINQ(searchResults.AsQueryable()); // Method I have to convert the LINQ query to a DataTable

        results = results.Merge(toMerge);

    }

Есть идеи?

Заранее спасибо

Крис

Ответы [ 2 ]

4 голосов
/ 06 марта 2012

Вам просто нужно сделать results.Merge(toMerge);, вы не должны делать results = results.Merge(toMerge);.Потому что функция Merg действует на вызывающую функцию DataTable и ничего не возвращает.

1 голос
/ 06 марта 2012

Я считаю, что использование Merge() и ConvertDataTable.FromLINQ() каждого цикла цикла довольно дорого. Почему бы просто не выполнить results.Rows.Add() одновременно с запросом результатов поиска?

foreach (string toFind in searchString)     
{
   var searchResults = dt.AsEnumerable()  
                         .Where(a => a.Field<string>("A")
                                      .ToUpper()
                                      .Contains(toFind.ToUpper())
                        .Select(a => new object[] {
                                           a.Field<Int32("A"),
                                           a.Field<string>("B"),
                                           a.Field<string>("C")
                         })
                        .ForEach(re => results.Rows.Add(re));
}


// ForEach() extension method would help you adding rows to a data table
// in the same time as querying the results
public static void ForEach<T>(
    this IEnumerable<T> source,
    Action<T> action)
{
    foreach (T element in source) 
        action(element);
}

Если у вас действительно много элементов, было бы интересно измерить фактическую производительность выполнения цикла, и пожалуйста, поделитесь результатами, если сможете:

var stopwatch = System.Diagnostics.Stopwatch.StartNew();
foreach () { ... }
stopwatch.Stop;
double totalMilliseconds = stopwatch.TotalMilliseconds;
...