2015-08-27 2 views
0

Мне нужна ваша помощь для небольшой проблемы. Я хотел бы сделать следующий LINQ-запрос динамическим (во время выполнения), потому что я не знаю, сколько таблиц будет в базе данных (имена таблиц известны во время выполнения).C# динамический запрос linq во время выполнения по datset

var query = from row1 in ds.Tables["tab1"].AsEnumerable() 
     from row2 in ds.Tables["tab2"].AsEnumerable() 
     from row3 in ds.Tables["tab3"].AsEnumerable() 
     select new { row1, row2, row3 }; 

Возможно ли это при генерации динамического запроса LINQ в этом случае и записать результат в DataTable или массив?

Заранее благодарен!

+0

Итак, вы хотите декартово произведение всех таблиц строк? –

+0

Да, Тим, что я хочу – derchrome

ответ

1

This extension method может создать декартовое произведение всех строк таблицы в DataSet.

public static class Extensions 
{ 
    public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences) 
    { 
     IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() }; 
     return sequences.Aggregate(
      emptyProduct, 
      (accumulator, sequence) => 
       from accseq in accumulator 
       from item in sequence 
       select accseq.Concat(new[] { item }) 
      ); 
    } 
} 

Теперь вы можете использовать его таким образом:

IEnumerable<IEnumerable<DataRow>> allTablesRows = ds.Tables.Cast<DataTable>() 
    .Select(table => table.AsEnumerable()) 
    .CartesianProduct(); 

Выход:

foreach (var x in allTablesRows) 
{ 
    foreach (DataRow row in x) 
    { 
     Console.WriteLine("table:{0} fields:{1}", 
      row.Table.TableName, 
      string.Join(",", row.ItemArray)); 
    } 
} 
+0

Впечатляет! СПАСИБО ОЧЕНЬ МНОГО ТИМ! – derchrome

+0

Еще один вопрос: у меня была небольшая ошибка в рассуждениях :-) Каждая таблица имеет идентификатор в качестве первого столбца. Мне нужно только умножить те строки/таблицы, которые имеют тот же ID в начале ... Можно ли добавить оператор «где»? – derchrome

+0

Возможно, это поможет предоставить небольшой пример вашего вопроса. Или - поскольку вопрос меняется - спросите другого. Вы хотите присоединиться к строкам с тем же идентификатором или хотите декартово произведение всех строк, где идентификатор появляется в другой таблице? Он становится все более и более неясным. –

Смежные вопросы