2011-01-02 7 views
0

Mit Linq zu NHibernate (NHibernate v3) Ich habe die folgende LINQ-Abfrage:Problem überspringen und Nehmen in NHibernate 3 Linq Abfrage

var session = this.GetSession(); 
    var rgn = this.Get(regionId); 

    var query = from t in session.Query<Tag>() 
       where 
        !(
         from trn in session.Query<Translation>() 
         where trn.Region.Id == regionId 
         select trn.Tag.Id 
        ) 
        .Contains(t.Id) 

       select new Translation() {Id = t.Id, Tag = t, Region = rgn, TagTranslation=""}; 

    var count = query.Count(); 
    var untranslatedTags = query.Skip((page - 1)*pageSize).Take(pageSize); 
    var countAfterSkipAndTake = untranslatedTags.Count(); 
    return untranslatedTags.ToList(); 
} 

die Zählvariable in der Tat den erwarteten Wert zurückgibt. Allerdings gibt countAfterSkipAndTake den gleichen Wert zurück. Ich hätte erwartet, dass es pageSize zurückgibt (was in diesem Fall 15 ist). Die letzte Zeile untranslatedTags.ToList() gibt eine Ausnahme zurück. Ich glaube, dass LINQ zu NHibernate nicht vollständig implementiert ist, bevor ich versuche, den Kofferraum herunterzuladen, kann irgendjemand etwas Offensichtliches sehen, das ich falsch gemacht habe.

Antwort

1

Ich würde raten, da ich ein ähnliches Problem in der Vergangenheit hatte, ist, dass die var count = query.Count(); nHibernate zwingt, die Abfrage zu kompilieren, und daher sind alle zukünftigen Änderungen zu vergeblich, da es bereits ausgeführt wurde.

Um dies zu testen, entfernen Sie diese Zeile und sehen, ob die countAfterSkipAndTake jetzt leider nicht 15.

+0

ist. Nach dem Ausprobieren aller möglichen Dinge sieht es so aus, als ob die LINQ-Implementierung von NHibernate die Auswahlprojektion nicht mag. Ich habe meine LINQ-Anweisung aktualisiert, um das Überspringen und Take einzufügen, und die Auswahlprojektion durch einen einfachen select() -Aufruf ersetzt und es hat funktioniert. In einer anderen Erklärung wollte ich den Unionsbetreiber verwenden, aber ich bekomme eine Ausnahme, die besagt, dass der Gewerkschaftsbetreiber noch nicht implimiert ist. Es scheint, als ob LINQ zu NHibernate immer noch einige Probleme hat. –