Angenommen, ich habe eine Klasse Product:
public class Product
{
public virtual string Name { get; set; }
public virtual IList<Order> Orders { get; set; }
}
und Klasse Ordnung:
public class Order
{
public virtual float Amount { get; set; }
public virtual DateTime Created { get; set; }
}
Nehmen wir an, sie werden (mit Fluent NHibernate) wie folgt abgebildet:
public class ProductMap : ClassMap<Product>
{
public ProductMap()
{
Map(x => x.Name);
HasMany(x => x.Orders).OrderBy("created desc");
}
}
public class OrderMap: ClassMap<Order>
{
public OrderMap()
{
Map(x => x.Amount);
Map(x => x.Created);
}
}
Wenn ich mir die Name
eines Product
sowie die Amount
der letzten Order
(die aufgrund meiner kartierten OrderBy
Klausel, die erste ist) in einer HQL-Anweisung, wie würde ich vorgehen? Etwa so (zur Veranschaulichung):
select p.Name, p.Orders[0].Amount from Product p
Ich habe schon viele Variationen ausprobiert, jede mit ihren eigenen Fehlern.
// Throws 'Property index does not exist in collection'
select p.Name, order.Amount from Product p join p.Orders as order where index(order) = 0
// Throws 'Antlr.Runtime.MismatchedTreeNodeException' on the brackets in p.Orders[0].
select p.Name, p.Orders[0] from Product P
// Throws 'Object reference not set to an instance of an object'
select p.Name, p.Orders[0].Amount from Product p
// Works fine, but not what I want
select p.name, order.Amount from Product p join p.Orders as order
In diesem Beispiel könnte ich mich mit der Verwendung von SetMaxResults()
aber in Wirklichkeit ist die Abfrage viel komplexer und gibt viele Zeilen zurück, so dass dies nicht ausreicht.
Ich habe das Gefühl, dass ich hier etwas Elementares übersehe, daher bin ich für jede Hilfe dankbar.
Verwenden: NHibernate 2.1.2.4000 und Fluent NHibernate 1.1.0.695