EntityDataSource с JOIN?
Я привязываю GridView к следующему EntityDataSource:
<asp:EntityDataSource ID="sessionQuery" runat="server"
ConnectionString="name=encoreEntities" DefaultContainerName="encoreEntities"
EnableFlattening="False" EntitySetName="sessions" Include="user, user.person"
Where="it.lastactivity > @NowMinusXMins" OrderBy="it.lastactivity desc" >
<WhereParameters>
<asp:Parameter Name="NowMinusXMins" Type="DateTime" />
</WhereParameters>
</asp:EntityDataSource>
Это отлично работает.
У меня есть другая таблица с именем SessionHistory, которая имеет внешний ключ в Session. Эта таблица отслеживает страницы, посещенные во время сеанса. Я хочу связать сущность Session с самой последней записью в SessionHistory и отобразить страницу в GridView.
Объединение будет примерно таким:
выберите * в сеансе s, где s.sessionid = (выберите топ 1 сеанса в порядке истории сеансов по lastactivitydate desc)
Я мог бы сделать это, как в этом посте: Внутреннее соединение запроса EntityDataSource, однако, я пытаюсь сохранить отношения EF, чтобы я мог ссылаться на них в своем Gridview (например, session.user.username, session.user.person.lastname, так далее.)
Есть ли способ сделать это?
1 ответ
Вот реальный пример, в котором есть две таблицы с тремя навигационными свойствами.
таблицы
- Таблица lm_m_location_type определяет местоположение (страна, город, штат и т. д.)
- Таблица lm_m_location содержит строки для расположений, расположенных в иерархии родителей / детей (например, США -> Флорида -> Тампа, Орландо, Майами)
Отношения
- lm_m_location_type определяет расположение от нуля до многих
- lm_m_location может иметь от нуля до нескольких дочерних локаций
- lm_m_location может иметь ноль или одну родительскую ячейку
Свойства навигации (из EntityFramework через Edit XML)
Имя NavigationProperty = ChildLocations Relationship = DB.fk_child_loc FromRole = lm_m_location ToRole = lm_m_location1
Имя NavigationProperty = ParentLocation Relationship = DB.fk_parent_loc FromRole = lm_m_location1 ToRole = lm_m_location
NavigationProperty Name = LocationType Relationship = DB.fk_loc_type FromRole = lm_m_location ToRole = lm_m_location_type
Пример кода: для доступа к местоположению, включая родительскую строку, дочерние строки и строку типа местоположения.
//
// code from the controller
//
public ActionResult getLocation()
{
var lm_m_location = db.lm_m_location
.Include("ParentLocation")
.Include("ChildLocations")
.Include("LocationType")
.Where(t => t.parent_location_id == LinkDB.MvcApplication.Location.Current.id);
return View(lm_m_location.ToList());
}
//
// code from the view that accesses each of the included tables
//
@model IEnumerable<LinkDBuilder.Models.lm_m_location>
@Html.DisplayFor(modelItem => item.description)
@Html.DisplayFor(modelItem => item.ParentLocation.description)
@Html.DisplayFor(modelItem => item.LocationType.description)
// inside a loop of the child locations
@Html.DisplayFor(modelItem => item.ChildLocations.description)
// just to show we could drill back to the grand parent location if we wanted
// of course we would make sure there was a value first in production code
@Html.DisplayFor(modelItem => item.ParentLocation.ParentLocation.description)
,