2

我有一个 Linq to dataset 查询,它连接两个表并从每个表中提取所需的参数。我需要让它们进入 aDataTable以绑定到 a DataGridView我在MSDN上找到的执行此操作的示例是一个从单个表中获取单个值的简单示例,但是当我尝试更改查询以遵循它时,我无法这样做。该CopyToDataTable()方法要求将查询分配给 a IEnumerable<DataRow>,但是当我这样做时,我被告知需要显式转换;但强制转换在运行时失败,但有以下例外:

无法将“d__61`4[System.Data.DataRow,System.Data.DataRow,System.Int32,<>f__AnonymousType0`1[System.Int32]]”类型的对象转换为“System.Collections.Generic.IEnumerable”类型1 [系统.数据.数据行]'。

原始工作查询:

var query = MyDataSet.Table1.AsEnumerable().Join(MyDataSet.Table2.AsEnumerable(),
    table1 => table1.Field<Int32>("Table1_Id"),
    table2 => table2.Field<Int32>("Table1_Id"),
    (table1, table2) => new
    {
        Table1ID = table1.Field<Int32>("Table1_Id")
        //Other parameters commented out to simplify the example
    });

具有显式转换的非工作查询:

IEnumerable<DataRow> query = (IEnumerable<DataRow>)MyDataSet.Table1.AsEnumerable()
                                             .Join(MyDataSet.Table2.AsEnumerable(),
    table1 => table1.Field<Int32>("Table1_Id"),
    table2 => table2.Field<Int32>("Table1_Id"),
    (table1, table2) => new
    {
        Table1ID = table1.Field<Int32>("Table1_Id")
        //Other parameters commented out to simplify the example
    });
4

3 回答 3

2

在这两种情况下,您都在创建一个新的“匿名类型”来存储结果。

要使第二个工作,您需要类似的东西:

var query = ... => new DataRow() 
{
});

除了这不起作用,因为 DataRow 没有公共构造函数并且不能以这种方式初始化。

所以,使用第一个并迭代结果(注意我在这里猜了一点,你必须先为 table3 设置列):

foreach (var row in query)
{
   var r = table3.NewRow();
   r["Table1ID"] = row.Table1ID;
   r["Table2ID"] = row.Table1ID;                
}

编辑:

 var query = ...;  // step 1

 query = query.ToList();  // add this,  step 2

 foreach(...) { }  // step 3

如果您分别对上述 3 个步骤计时,您可能会发现第 2 步花费的时间最多。

于 2009-12-09T22:03:55.997 回答
0

嗨,这是另一种方法。

        //I have created datatable Address having AddressID<int32>,Name-srting,LastName-string
        DataSet ds= new DataSet();
        ds.Tables["Address"].Rows.Add(new object[] { 1, "Priya", "Patel" });
        ds.Tables["Address"].Rows.Add(new object[] { 2, "Bunty", "Rayapati" });
        ds.Tables["Address"].Rows.Add(new object[] { 3, "Birva", "Parikh" });
        //i have created Datatable AddressType having AddressTypeID int32 and State- string
        ds.Tables["AddressType"].Rows.Add(new object[] { 1, "Virginia" });
        ds.Tables["AddressType"].Rows.Add(new object[] { 2, "Nebraska" });
        ds.Tables["AddressType"].Rows.Add(new object[] { 3, "Philadeplhia" });

        DataTable dt1 = ds.Address.CopyToDataTable(); 
        DataTable dt2 = ds.AddressType.CopyToDataTable();
        DataTable dt3 = new DataTable();

        var query = dt1.AsEnumerable().Join(dt2.AsEnumerable(),
            dmt1 => dmt1.Field<Int32>("AddressID"),
                dmt2 => dmt2.Field<Int32>("AddressTypeID"),
        (dmt1, dmt2) => new 
        {
            Table1ID = dmt1.Field<Int32>("AddressID")
            //Other parameters commented out to simplify the example
        });
        query.ToList();
        //FullAddress is my third Datatable is having AID
        foreach (var row in query)
        {
            var r = ds.FullAddress.NewRow();
            r["AID"] = row.Table1ID;
            ds.FullAddress.Rows.Add(r.ItemArray);

        }
于 2010-12-13T03:21:37.770 回答
0

我遇到了这样的错误,因为after many joins statements在您的 LINQ 查询中编译器create new type that concatenate all your models

所以很难直接投入

但是您知道结果仅包含一个特定的模型,您可以再做一步来帮助编译器对其进行强制转换,即

MyListOfTypeIEnumerable.ToArray()

看看我的问题并ToArray()解决它

public static IList<Letter> GetDepartmentLetters(int departmentId)
    {
        IEnumerable<Letter> allDepartmentLetters = from allLetter in LetterService.GetAllLetters()
            join allUser in UserService.GetAllUsers() on allLetter.EmployeeID equals allUser.ID into usersGroub
            from user in usersGroub.DefaultIfEmpty()
            join allDepartment in DepartmentService.GetAllDepartments() on user.DepartmentID equals allDepartment.ID
            where allDepartment.ID == departmentId
            select allLetter;
        return allDepartmentLetters.ToArray();
    }
于 2016-08-04T08:32:24.393 回答