使用includes展平Entity Framework对象查询结果

时间:2011-11-23 22:06:24

标签: asp.net entity-framework objectquery

我正试图掌握Entity Framework,有一件事真的让我感到沮丧。我仍然不完全确定术语并没有帮助,我试图避免同时学习LINQ,所以谷歌搜索是困难的。

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

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

看起来我得到了我想要的东西(公司 - &gt;结果视图[0] .Addresses.Count是&gt; 0)

我现在要做的是将公司名称和所有地址绑定到ASP.NET应用程序中的gridview

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) - 我认为因为公司 - &gt;结果视图[0] .Name存在但.Address不存在(因为它隐藏在地址关系中)。绑定到Addresses.Address也没有帮助。

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

有没有办法'展平'我的结果,以便顶级对象为所有包含的字段提供附加信息?

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:6)

您的objectquery正在返回一个图表。虽然我认为你真的应该把它搞砸并学习linq,如果你想用.NET编程(大笑...除了真的,你应该),你可以编写一个投影查询来带回平坦的结果并绑定在ASP中。净。

扁平化的诀窍是从关系中的“孩子”开始。所以这样:

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

(代码无法保证,因为stackoverflow UI不提供.net intellisense或编译时检查.shehh。)。

答案 1 :(得分:0)

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

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

因此,您提到的主题中的代码可以解决您的问题。

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