2

2 つのテーブルを結合し、それぞれから目的のパラメーターを抽出する Linq to dataset クエリがあります。DataTableにバインドするには、それらを に取得する必要がありDataGridViewます。MSDNでこれを実行するために見つけた例は、1 つのテーブルから 1 つの値を取得する簡単な例ですが、それに従うようにクエリを変更しようとすると、変更できませんでした。このCopyToDataTable()メソッドでは、クエリを に割り当てる必要がありますが、IEnumerable<DataRow>そうすると、明示的なキャストが必要であると言われます。ただし、キャストは実行時に次の例外で失敗します。

タイプ 'd__61`4[System.Data.DataRow,System.Data.DataRow,System.Int32,<>f__AnonymousType0`1[System.Int32]]' のオブジェクトをタイプ 'System.Collections.Generic.IEnumerable` にキャストできません1[System.Data.DataRow]'.

元の作業クエリ:

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

どちらの場合も、結果を保存するために新しい「匿名型」を作成しています。

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

あなたのLINQafter many joins statementsクエリではコンパイラがcreate new type that concatenate all your models

だから直接キャストするのは難しい

ただし、結果に特定のモデルが 1 つしか含まれていないことがわかっている場合は、コンパイラがモデルをキャストできるようにするために、もう 1 つの手順を実行できます。

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 に答える
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 に答える