Как вернуть первый объект коллекции от его родителя - PullRequest
3 голосов
/ 12 февраля 2009

Я хочу сделать следующее с одним запросом к базе данных, если это возможно.

public class Location
{
    public string URL {get;set;}
    public IList<Page> Pages {get;set;}
}

Page firstPage = Session.Linq<Location>()
                .Where(location => location.URL == "some-location-url")
                .Select(location => location.Pages).FirstOrDefault();

Моя цель основана на URL текущего местоположения, вернуть первый объект Page из коллекции страниц.

Я уже пробовал несколько разных способов, и все они, кажется, выполняют много запросов, чтобы получить нужный объект Page.

Любая помощь приветствуется!

Дэйв ниндзя

Ответы [ 3 ]

0 голосов
/ 12 февраля 2009

Запустите запрос против Page вместо Location: вам вообще не нужно возвращать запись Location.

(from p in AllPages
where p.Location.URL == "some-location-url"
select p).FirstOrDefault();

[Почти всегда, когда я зацикливаюсь на написании запроса LINQ, я считаю, что это помогает начать строить запрос из самого нижнего объекта в задействованных отношениях родитель-потомок.]

0 голосов
/ 12 февраля 2009

Не могли бы вы добавить заказ напрямую в отображение коллекции. Вы могли бы тогда сделать

Page firstPage = Session.Linq<Location>()
              .Where(location => location.URL == "some-location-url")
              .Select(location => location.Pages.FirstOrDefault()).FirstOrDefault();

FirstOrDefault может остановить NHibernate, делая все выборки.

Никаких гарантий на это нет, так как я не настроил linq to nhibernate для проверки.

0 голосов
/ 12 февраля 2009

Это может быть то, что вы ищете:

Page firstPage = Session.Linq<Page>()
.OrderBy(page => page.Index)
.FirstOrDefault(page=> page.Location.URL == "some-location-url");

Я предполагаю, что у страницы есть свойство Location, которое связано с Location, к которому она принадлежит, и .Index будет тем свойством, которое вы хотите заказать.

...