Сглаживание результата объектного запроса Entity Framework с помощью include - PullRequest
0 голосов
/ 24 ноября 2011

Я пытаюсь разобраться с Entity Framework, и есть одна вещь, которая меня действительно сбивает с толку. Это не помогает, что я все еще не совсем уверен в терминологии, и я пытаюсь избежать изучения LINQ в то же время, поэтому поиск в Google затруднен.

У меня есть две таблицы: компания и адреса с отношением 1-ко-многим. Если я напишу следующее:

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

Похоже, я получаю то, что хочу (компании -> Просмотр результатов [0]. Адреса. Количество> 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]. Имя существует, но .Address нет (потому что он похоронен в отношении адресов). Привязка к адресам. Адрес также не помогает.

Я нашел один действительно ужасный обходной путь внизу этой темы , но я бы предпочел этого избежать, если это возможно.

Есть ли способ «сгладить» мои результаты, чтобы объекты верхнего уровня предоставляли адрес всем включенным полям?

Любая помощь высоко ценится!

Ответы [ 2 ]

6 голосов
/ 24 ноября 2011

Ваш объектный запрос возвращает график. Хотя я думаю, что вам действительно следует смириться с этим и изучить linq, если вы хотите программировать на .NET (большая ухмылка ... кроме как на самом деле, вы должны), вы могли бы написать проекционный запрос, чтобы вернуть сглаженные результаты и связать их в ASP .СЕТЬ.

Хитрость в выравнивании заключается в том, чтобы начинать с «ребенка» в отношениях. Так что-то вроде этого:

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

(код не гарантирован, так как пользовательский интерфейс stackoverflow не обеспечивает .net intellisense или проверку времени компиляции. Sheesh.).

0 голосов
/ 24 ноября 2011

Я не совсем понимаю, почему вы находите решение использовать поле шаблона безобразным?

Связанные поля могут быть привязаны только к обычным свойствам. Чтобы привязать навигационное свойство, необходимо использовать поле «Шаблон».

Таким образом, код в упомянутой вами теме решает вашу проблему.

Если вы действительно считаете это уродливым, вы можете реализовать свое собственное связанное поле и сделать так, чтобы оно поддерживало вложенные привязки, но я думаю, что использование поля шаблона - более хорошее решение.

...