我需要你帮助解决一个小问题。我想将以下LINQ查询动态化(在运行时),因为我不知道数据库中将有多少个表(表名在运行时是已知的)。
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查询并将结果写入数据表或数组?
提前致谢!
答案 0 :(得分: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));
}
}