我正试图掌握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的底部发现了一个非常丑陋的解决方法,但如果可能的话我宁愿避免使用它。
有没有办法'展平'我的结果,以便顶级对象为所有包含的字段提供附加信息?
非常感谢任何帮助!
答案 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)
我不完全明白为什么你发现使用模板字段的解决方案很难看?
绑定字段只能绑定到常规属性。要绑定到导航属性,您必须使用模板字段。
因此,您提到的主题中的代码可以解决您的问题。
如果你真的发现这个丑陋,你可以实现自己的绑定字段并使其支持嵌套绑定,但我认为使用模板字段是一个更好的解决方案。