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)

,

Другие вопросы по тегам