我正试图掌握实体框架,有一件事真的让我绊倒。这并没有帮助,我仍然不是完全确定的术语,我试图避免学习LINQ在同一时间,所以谷歌是困难的。
我有两个表,公司和地址,它们具有一对多的关系。如果我这样写:
ObjectQuery<Company> companies = queryContext.Companies.Include("Addresses");
它看起来像我得到我想要的(公司->结果视图[0].地址。计数> 0)
我现在想做的是绑定公司名称和所有地址到一个ASP中的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
) -我认为是因为companies -> Results View[0]。Name存在,但. address不存在(因为它隐藏在Addresses关系中)。绑定地址。地址也没用
我在这个线程的底部发现了一个非常丑陋的解决方案,但如果可能的话,我宁愿避免它。
是否有任何方法来"扁平化"我的结果,以便顶层对象提供地址到所有包含的字段?
任何帮助都非常感谢!
objectquery返回一个图。但是我认为如果你想用。net编程,你真的应该忍一忍,学习linq。你可以编写一个投影查询来返回平面化的结果,并将它们绑定到ASP.NET中。
扁平化的诀窍是从关系中的"孩子"开始。像这样:
grid.datasource= context.Addresses.Select
(a=>new {a.Company.CompanyName,a.Street, a.City}).ToList();
(代码不保证,因为stackoverflow UI不提供。net智能感知或编译时检查。天哪)。.
我不完全明白为什么你发现使用模板字段的解决方案是丑陋的?
绑定字段只能绑定到常规属性。要绑定到导航属性,你必须使用Template字段。
所以你提到的线程中的代码解决了你的问题。
如果你真的觉得这很难看,你可以实现你自己的绑定字段,使它支持嵌套绑定,但我认为使用模板字段是一个更好的解决方案