2013-04-13 68 views
0

我有這個疑問:NHibernate的LINQ的 - 支持fetchmany有許多計數== 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(); 

AlbumListTrack(的hasMany)。 TrackListIndices(hasmany)。

而不是獲得20行,我得到2行。
當我在剖析器中看到結果時,它看起來像Take指的是Track而不是Album
任何想法? 感謝

回答

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

QueryOver

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

我不是一個大的LINQ to NHibernate的專家,但我知道還有另一種方式來查詢NHibernate的可能幫助你,以及。它被稱爲QueryOver。它是使用類似Linq的成員表達式的強類型查詢語法。現在QueryOver在NHibernate社區中更加健壯,主要是因爲它基於標準查詢(已經存在相當一段時間)。

如果您有興趣瞭解更多關於不同的查詢語言,你應該看看這個網站:NHibernate: Queries

我也有一個博客,我有不同的插件和技術,您可以用NHibernate的使用物品(包括如何查詢) - My Blog

下面應該是您可能正在尋找使用查詢的一個緊密表示。

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類型的其他參數的方法調用specifiy連接類型。 例如:

.JoinAlias(() => a.Tracks,() => t, JoinType.LeftOuterJoin) 
+0

此查詢轉換查詢確實遭受與OP描述相同的問題。 Take將應用於Join,並且不會返回20個專輯,但會返回20個連接行。 – Firo

相關問題