如何从其父级返回集合的第一个对象

时间:2009-02-12 14:16:34

标签: c# linq nhibernate linq-to-nhibernate

如果可能,我希望使用单个数据库查询执行以下操作。

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();

我的目标是基于当前位置网址,从其网页集合中返回第一个Page对象。

我现在尝试了许多不同的方法,他们似乎都执行了很多查询来获取所需的Page对象。

感谢任何帮助!

忍者戴夫

3 个答案:

答案 0 :(得分:0)

这可能就是你要找的东西:

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

我假设页面有一个Location属性,该属性与它所属的Location相关,而.Index将是你要订购的属性。

答案 1 :(得分:0)

针对Page而不是针对Location运行查询:您根本不需要返回Location记录。

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

[几乎总是当我遇到编写LINQ查询时,我发现从所涉及的父子关系中最底层的对象开始构建查询会有所帮助。]

答案 2 :(得分:0)

您是否可以直接向集合的映射添加订单。然后你可以做

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

FirstOrDefault可以阻止NHibernate进行所有选择。

对此没有保证,因为我没有将linq设置为nhibernate来测试它。