2

結合する必要がある 3 つの DataTables があり、結合されたデータを GridView の DataSource として使用します。最初の ( localSQLTable) は、MS-SQL データベースに対するクエリによって入力されます。2 番目の 2 つ (serviceResponse.Tables(0)と) は、Web サービスの結果をserviceResponse.Tables(1)使用して構築されます。DataSet.ReadXML

私はここまで来ました:

Dim joinedData = From f In localSQLTable _
                 Join s1 As DataRow In serviceResponse.Tables(0) _
                 On f.Item("KNum") Equals s1.Item("Number") _
                 Join s2 As DataRow In serviceResponse.Tables(1) _
                 On s1.Item("KNumber_Id") Equals s2.Item("KNumber_Id") _
                 Select Guid = f.Item("Guid"), Num = f.Item("Num"), Desc = f.Item("Desc"), KNum = f.Item("KNum"), KDesc = s2.Item("KDescription_Text"), Type = s2.Item("Type") _
                 Where (Type.ToString.ToUpper = "LONG_HTML")

myGridView.DataSource = joinedData
myGridView.DataBind()

ただし、これjoinedDataは単なる IEnumerable (匿名型) のようです。以下を含むいくつかのことを試しました。

  • joinedData新しいDataRowを構築するためにラムダ関数(私はまったく慣れていません)を使用してIEnumerable(Of DataRow)として構築しようとしています
  • 結果セットで.ToList()or (型をいじった後) を呼び出す.AsEnumerable()

主な問題は、私が何をしようとしても、結果を GridView の DataSource として使用すると何か問題があるということです - 私は2つの例外のうちの1つを得ました:

  • ID を持つ GridView のデータ ソースには、列を生成するためのプロパティまたは属性がありませんでした。データ ソースにコンテンツがあることを確認します。
  • データ ソースは、サーバー側のデータ ページングをサポートしていません。

.Item ("Field")また、Linq クエリで厳密に型指定されたものの代わりに使用するべきではないこともわかってい.Field (Of T)("Field")ます。データが実際に使用可能になるまで、その変更を待っていました。

私はLinqと結婚していません。より適切な場合DataSet.Merge(または他の方法論)、私はそれを楽しませます。また、後で別の 2 つの DataTables に実際に結合する必要があるという明確な可能性もあります。その場合は、serviceResponseテーブルを 1 つにマージする可能性が高いため、結合するテーブルは 3 つだけです。

では、このデータを結合し、結果を GridView の DataSource として使用するにはどうすればよいでしょうか? また、元の DataTable ( localSQLTable) に 2 つの余分な列を追加し、XML 応答データを使用して行ごとに入力するよりも、私が行っていることは速くなるでしょうか?

4

2 に答える 2

2

f.Field<Guid>("Guid")代わりにSELECT を使用する

例 (C#)

gv.DataSource = serviceResponse.Tables[0].AsEnumerable().Select(r => new { Name = r.Field<Guid>("Guid") });
gv.DataBind();

例 (動詞)

gv.DataSource = dt.AsEnumerable().Select(Function(r) New With { .Name = r.Field(Of Guid)("Guid") })
gv.DataBind()

AutoGenerateColumnsまたはGridViewで無効にします

編集: 次のクエリは正常に機能します

void Main()
{
    var dt1 = new DataTable();
    dt1.Columns.Add("Col1", typeof(string));

    var dt2 = new DataTable();
    dt2.Columns.Add("Col2", typeof(string));

    var row = dt1.NewRow();
    row[0] = "test";
    dt1.Rows.Add(row);

    row = dt2.NewRow();
    row[0] = "test";
    dt2.Rows.Add(row);

    var gv = new GridView();
    gv.DataSource = from t1 in dt1.AsEnumerable()
                    join t2 in dt2.AsEnumerable()
                        on t1[0] equals t2[0]
                    select new
                    {
                        Name1 = t1.Field<string>(0),
                        Name2 = t2.Field<string>(0)
                    };
    gv.DataBind();
}
于 2011-04-08T13:25:24.323 に答える
0

これらすべての最終結果は次のとおりです。

Dim joinedData As Generic.IEnumerable(Of DataRow) = (From f In localSQLTable.AsEnumerable() _
                                                     Join h In serviceResponse.Tables(0).AsEnumerable() _
                                                     On h.Item("serviceknum") Equals f.Item("knum") _
                                                     Select GetFinalDataRow(finalTable, f, h))

gvGridOne.DataSource = joinedData.CopyToDataTable()
gvGridOne.DataBind()

必要な末尾の DataTable の DataTable とスキーマ (DataColumns を追加することにより) を明示的に定義し、その DataTable と 2 つの DataRows を に渡し、次のGetFinalDataRow()ように定義します。

Public Function GetFinalDataRow(ByRef FinalTable As DataTable, ByVal Row1 As DataRow, ByVal Row2 As DataRow) As DataRow
    Dim newRow As DataRow = FinalTable.NewRow()
    For Each col As DataColumn In FinalTable.Columns
        If Row1.Table.Columns.Contains(col.ColumnName) Then
            newRow(col.ColumnName) = Row1.Item(col.ColumnName)
        ElseIf Row2.Table.Columns.Contains(col.ColumnName) Then
            newRow(col.ColumnName) = Row2.Item(col.ColumnName)
        Else
            newRow(col.ColumnName) = ""
        End If
    Next

    Return newRow
End Function

JoinedData オブジェクトは DataRows の IEnumerable になりました。これを GridView のデータソースの DataTable にコピーすると、列が自動生成され、ページングが可能になります。

于 2011-04-12T16:05:23.363 に答える