我有以下代码:
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)
我得到的错误是“意外使用未绑定的通用名称。”
为了能够将此代码正确地重构为方法,我需要做些什么的建议?谢谢!
答案 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
}