Ich erstelle ein erweitertes Suchformular für meine ASP.NET MVC App.NHibernate ICriteria Abfrage mit Komponenten und Sammlungen für die erweiterte Suche
ich ein Customer-Objekt haben, mit einer Adresse Komponente: Fluent NHibernate-Mapping:
public CustomerMap()
{
WithTable("Customers");
Id(x => x.Id)
.WithUnsavedValue(0)
.GeneratedBy.Identity();
Map(x => x.Name);
Map(x => x.Industry);
Component(x => x.Address, m =>
{
m.Map(x => x.AddressLine);
m.Map(x => x.City);
m.Map(x => x.State);
m.Map(x => x.Zip);
});
In meinem Customer-Klasse ctor, null Objekte zu verhindern, habe ich folgendes:
public Customer()
{
Address = new Address();
}
Mein Suchformular hat die folgenden Felder, die der Benutzer durchsuchen kann:
- Cus Tomer Namen
- Stadt
- Staat
- Industrie
Alle diese Felder sind optional.
Meine NHibernate Criteria sieht wie folgt aus (Kunde aus dem Formular übergeben wird, um die ASP.NET MVC Modell Binder verwendet wird):
var p = Session.CreateCriteria(typeof(Customer))
.Add(Example.Create(customer).ExcludeZeroes().IgnoreCase().EnableLike())
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("Id"), "Id")
.Add(Projections.Property("Name"), "Name")
.Add(Projections.Property("Address.City"), "City")
.Add(Projections.Property("Address.State"), "State")
.Add(Projections.Property("PhoneNumber"), "PhoneNumber"))
.AddOrder(Order.Asc("Name"))
.SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean(typeof(CustomerDTO)));
return p.List<CustomerDTO>() as List<CustomerDTO>;
Beachten Sie, dass ich .ExcludeZeroes bin mit() NULL-Werte auszuschließen und Null-Standardwerte. Dies ist erforderlich, da mein Customer-Objekt einige INTs enthält (in dieser Veröffentlichung aus Platzgründen ausgeschlossen), die in der Abfrage standardmäßig auf null (0) gesetzt würden, was zu inkorrekten Abfragen führen würde.
Wenn ich betreiben diese mit allen Feldern leer (ok, da sie optional sind), die resultierenden SQL wie folgt aussehen:
SELECT this_.Id as y0_,
this_.Name as y1_,
this_.City as y2_,
this_.State as y3_,
this_.PhoneNumber as y4_
FROM Customers this_
WHERE (lower(this_.Industry) like '' /* @p0 */
and lower(this_.State) like '' /* @p1 */)
ORDER BY y1_ asc
Industrie und Staat ist Drop-downs in dem Web-Formular, aber Im obigen Beispiel habe ich sie leer gelassen. Aber die ExcludeZeroes() - Deklaration scheint nicht für diese Felder zu gelten.
Wenn ich manuell vor den Kriterien überprüfen:
if (customer.Address.State == "")
{
customer.Address.State = null;
}
und das gleiche für Industrie, werden die Kriterien dann arbeiten.
Ich gehe davon aus, dass dies mit mir zu tun hat, das Adressobjekt in meinem Kunden ctor initialisieren. Ich hasse es, dies zu ändern, aber ich kenne keine andere Möglichkeit, die Kriterien zu erfüllen, ohne manuell nach leeren Zeichenfolgenwerten aus dem Formular zu suchen (wodurch der Vorteil beseitigt wird, ein Beispielobjekt mit ICriteria zu verwenden).
Warum? Wie kann ich diese Kriterienabfrage ausführen?
Sind Sie mit Query By Example verheiratet? –
Nicht genau, obwohl es den Code im Falle eines erweiterten Suchformulars flexibler macht. Ich kann den obigen Code funktionieren lassen, wenn ich die Komponente auf leere Zeichenfolge überprüfe und sie in Nullen umwandle, und es funktioniert. Ich kann auch HQL verwenden und es funktioniert, aber es scheint hässlicher als notwendig. Ich hoffte, dass QBE funktionieren würde, ohne den Code mit unnötigen Überprüfungen zu überfrachten. –