0

我正在尝试掌握 Entity Framework,但有一件事真的让我很头疼。我仍然不完全确定术语并没有帮助,而且我试图避免同时学习 LINQ,所以谷歌搜索很困难。

我有两张表,公司和地址具有一对多的关系。如果我写以下内容:

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

看起来我得到了我想要的(公司 -> 结果视图 [0].Addresses.Count 是 > 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) - 我认为是因为公司 -> Results View[0].Name 存在,但 .Address 不存在(因为它隐藏在 Addresses 关系中)。绑定到 Addresses.Address 也无济于事。

我在这个线程的底部发现了一个非常丑陋的解决方法,但如果可能的话,我宁愿避免它。

有什么方法可以“展平”我的结果,以便顶级对象为所有包含的字段提供地址?

非常感谢任何帮助!

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 intellisense 或编译时检查。sheesh。)。

于 2011-11-23T23:34:43.820 回答
0

我不完全明白为什么您发现使用模板字段的解决方案很难看?

绑定字段只能绑定到常规属性。要绑定到导航属性,您必须使用模板字段。

所以你提到的线程中的代码解决了你的问题。

如果你真的觉得这很难看,你可以实现自己的绑定字段并使其支持嵌套绑定,但我认为使用模板字段是一个更好的解决方案。

于 2011-11-23T22:15:39.767 回答