0

我有这个查询:

 var query = session.Query<Album>()
                    .FetchMany(x => x.Tracks)
                    .ThenFetchMany(x => x.Indices)
                    .Where(t => t.Tracks.Any(v => v.Indices.Count == 0))
                    .Take(20)
                    .ToList();

AlbumList Track(hasman)。 TrackList Indices(hasman)。

而不是得到 20 行,我得到 2 行。
当我在分析器中看到结果时,看起来Take是指的是Track而不是Album.
任何想法?谢谢

4

2 回答 2

0

我不是一个大的 Linq to NHibernate 专家,但我知道还有另一种查询 NHibernate 的方法也可以帮助你。它被称为QueryOver。它是使用类似 Linq 的成员表达式的强类型查询语法。现在QueryOver在 NHibernate 社区中更加强大,主要是因为它基于标准查询(已经存在了很长一段时间)。

如果您有兴趣了解有关不同查询语言的更多信息,您应该查看此站点:NHibernate:查询

我还有一个博客,其中有一篇关于您可以与 NHibernate 一起使用的不同插件和技术的文章(包括查询方式) -我的博客

下面应该是您使用查询结束时可能正在寻找的内容的近似表示。

Album a = null;
Tracks t = null;
Indices i = null;
var query = session.GetQueryOver(() => a)
    .JoinAlias(() => a.Tracks, () => t)
    .JoinAlias(() => t.Indicies, () => i)
    .Where(() => i.Indices.Count() == 0)
    .Take(20)
    .ToList()
    ;

JoinType在向查询添加连接时,您还可以通过向方法调用添加另一个类型的参数来指定连接类型。前任:

.JoinAlias(() => a.Tracks, () => t, JoinType.LeftOuterJoin)
于 2013-04-16T14:45:34.083 回答
0

LINQ

var filtered =
    from a in session.Query<Album>()
    from t in a.Tracks
    where !t.Indices.Any()
    select a.Id

var results = session.Query<Album>()
     .Where(a => filtered.Contains(a.Id))
     .Take(20)
     .List()

查询结束

var results = session.QueryOver<Album>()
     .WhereRestrictionOn(a => a.Id).IsIn(QueryOver.Of<Album>()
         .JoinQueryOver(a => a.Tracks)
             .Where(t => !t.Indices.Any())
         .Select(a => a.Id))
     .Take(20)
     .List()
于 2013-04-16T14:30:17.607 回答