使用AsEnumerable重构代码

时间:2017-12-22 19:49:35

标签: c# console-application

我有以下代码:

var results = from table1 in ds.Tables[0].AsEnumerable()
join table2 in ds.Tables[1].AsEnumerable()
on table1["VendorNumber"] equals table2["VendorNumber"]
join table3 in ds.Tables[2].AsEnumerable()
on table1["VendorNumber"] equals table3["VendorNumber"]
select new
{ (select clause removed to save space here };

我试图将其重构为一种方法,但是当我这样做时,它给了我错误。重构方法的第一行是:

private static IEnumerable<> Enumerable(DataSet ds)

我得到的错误是“意外使用未绑定的通用名称。”

为了能够将此代码正确地重构为方法,我需要做些什么的建议?谢谢!

2 个答案:

答案 0 :(得分:0)

您似乎正在使用 ADO.Net DataSet获取表格并尝试将表格与 LINQ 一起加入。你不能这样做。 DataRow中的每个DataTable都应转换为与其包含的数据等效的对象。然后你可以加入对象。例如,如果其中一个DataTable包含Foo数据:

public class Foo
{
    public int FooId { get; }

    public int BarId { get; }

    public Foo(DataRow row)
    {
        FooId = row.Field<int>(nameof(FooId));
        BarId = row.Field<int>(nameof(BarId));
    }
}

另一个DataTable包含Bar数据:

public class Bar
{
    public int BarId { get; }

    public Bar(DataRow row)
    {
        BarId = row.Field<int>(nameof(BarId));
    }
}

然后你会加入他们这样的IEnumerable匿名FooBar个对象:

var ds = new DataSet();

var foos = ds.Tables[0].Rows.OfType<DataRow>().Select(dr => new Foo(dr));
var bars = ds.Tables[1].Rows.OfType<DataRow>().Select(dr => new Bar(dr));

var foobars = from foo in foos
              join bar in bars
              on foo.BarId equals bar.BarId
              select new { Foo = foo, Bar = bar};

您可以改为使用ValueTuple

var foobars = from foo in foos
              join bar in bars
              on foo.BarId equals bar.BarId
              select (Foo: foo, Bar: bar);

顺便说一下.Field<T>扩展名在System.Data.DataSetExtensions

答案 1 :(得分:0)

您需要指定集合元素的类型或使用类型参数

private static IEnumerable<T> Enumerable(DataSet ds)
{
    // function body here
}

在您的情况下,该函数返回DataRow元素的集合(请参阅DataTableExtensions.AsEnumerable Method description)。所以,你可以使用

private static IEnumerable<DataRow> Enumerable(DataSet ds)
{
    // function body here
}