c#运行时在datset上的动态linq查询

时间:2015-08-27 11:22:49

标签: linq

我需要你帮助解决一个小问题。我想将以下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查询并将结果写入数据表或数组?

提前致谢!

1 个答案:

答案 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));
    }
}