2013-04-13 2 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(); 

Album имеет ListTrack (hasmany). Track имеет ListIndices (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 для 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 для вызова метода. Ex:

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

Этот запрос на запрос имеет ту же проблему, что описывает OP. Take будет применен к Join и не будет возвращать 20 альбомов, а 20 присоединяться к строкам. – Firo

Смежные вопросы