0

私は Entity Framework を理解しようとしていますが、本当につまずいていることが 1 つあります。専門用語がまだ完全にわからないことは役に立ちません。また、同時に LINQ を学習することを避けようとしているため、グーグル検索は困難です。

1対多の関係を持つ会社と住所の2つのテーブルがあります。私が次のように書くと:

ObjectQuery<Company> companies = queryContext.Companies.Include("Addresses");

欲しいものを手に入れているようです (会社 -> 結果ビュー[0].Addresses.Count is > 0)

ここでやりたいことは、会社名とすべての住所を ASP.NET アプリケーションのグリッドビューにバインドすることです

this.CompaniesGrid.DataSource = companies;
this.CompaniesGrid.DataBind();

<asp:GridView runat="server" ID="CompaniesGrid" AllowSorting="true">
    <Columns>
        <asp:BoundField DataField="Name" />
        <asp:BoundField DataField="Address" />
    </Columns>
</asp:GridView>

これだけでエラー ( A field or property with the name 'Address' was not found on the selected data source) がスローされます - 会社 -> 結果ビュー[0].Name は存在しますが、.Address は存在しないためだと思います (アドレス関係に埋もれているため)。Addresses.Address へのバインドも役に立ちません。

このスレッドの最後に非常に醜い回避策が 1 つ見つかりましたが、できれば避けたいと思います。

トップレベルのオブジェクトが含まれるすべてのフィールドにアドレスを提供するように、結果を「平坦化」する方法はありますか?

どんな助けでも大歓迎です!

4

2 に答える 2

6

objectqueryはグラフを返しています。.NETでプログラミングしたい場合は、本当にそれを吸い上げてlinqを学ぶ必要があると思いますが(大笑い...本当にそうする必要があります)、プロジェクションクエリを記述して、フラット化された結果を戻し、ASPでバインドすることができます。 。ネット。

平坦化の秘訣は、関係の「子」から始めることです。したがって、次のようになります。

grid.datasource= context.Addresses.Select
          (a=>new {a.Company.CompanyName,a.Street, a.City}).ToList();

(stackoverflow UIは.netインテリセンスまたはコンパイル時チェックを提供しないため、コードは保証されません。sheesh。)

于 2011-11-23T23:34:43.820 に答える
0

テンプレートフィールドを使用するための解決策が醜いと思う理由が完全にはわかりませんか?

バインドされたフィールドは、通常のプロパティにのみバインドできます。ナビゲーションプロパティにバインドするには、テンプレートフィールドを使用する必要があります。

したがって、あなたが言及したスレッドのコードはあなたの問題を解決します。

これが本当に醜い場合は、独自のバインドされたフィールドを実装して、ネストされたバインディングをサポートするようにすることができますが、テンプレートフィールドを使用する方が優れたソリューションだと思います。

于 2011-11-23T22:15:39.767 に答える