Wie erzielt man mit nHibernate und QueryOver API ein eindeutiges Ergebnis?
Ich habe das Repository-Methode
public IList<Message> ListMessagesBy(string text, IList<Tag> tags, int pageIndex, out int count, out int pageSize)
{
pageSize = 10;
var likeString = string.Format("%{0}%", text);
var query = session.QueryOver<Message>()
.Where(Restrictions.On<Message>(m => m.Text).IsLike(likeString) ||
Restrictions.On<Message>(m => m.Fullname).IsLike(likeString));
if (tags.Count > 0)
{
var tagIds = tags.Select(t => t.Id).ToList();
query
.JoinQueryOver<Tag>(m => m.Tags)
.WhereRestrictionOn(t => t.Id).IsInG(tagIds);
}
count = 0;
if(pageIndex < 0)
{
count = query.ToRowCountQuery().FutureValue<int>().Value;
pageIndex = 0;
}
return query.OrderBy(m => m.Created).Desc.Skip(pageIndex * pageSize).Take(pageSize).List();
}
Liefern Sie einen freien text search-string und eine Liste von Tags.
Das problem ist, dass wenn eine Nachricht mehr als einen tag, es ist mal dupliziert.
Ich möchte ein bestimmtes Ergebnis auf der Grundlage der Message-Entität. Ich habe
Projections.Distinct
Aber es erfordert eine Liste der Eigenschaften, um auf die deutliche Frage auf. Diese Meldung ist meiner Entität root gibt es die meisten ein Weg, um dieses Verhalten ohne die Bereitstellung alle von der Entität Eigenschaften?
Vielen Dank im Voraus, Anders
InformationsquelleAutor der Frage Anders | 2011-01-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie mit der ICriteria-API, die Sie benötigen:
Wenn Sie mit der QueryOver-API, die Sie benötigen:
Aber Vorsicht, dies alles geschieht auf der client-Seite, also alle doppelten Zeilen sind immer noch gezogen.
InformationsquelleAutor der Antwort Sly
Probieren Sie etwas wie dieses
InformationsquelleAutor der Antwort Craig
Können Sie SelectList und GroupBy, e.g:
Sollte funktionieren und produzieren die gleiche query plan als deutlich.
Wenn Sie mehrere Elemente in der Gruppe, etwas zu tun:
InformationsquelleAutor der Antwort Chris Haines
Ich habe vor kurzem eine Methode zur Anwendung select distinct basiert auf einem zugeordneten Objekt-Typ.
Es gilt diese zu einem IQueryOver-Objekt (Eigenschaft der Klasse). Methode hat auch Zugriff auf die nhibernate-Konfiguration. Man könnte hinzufügen, werden diese als Parameter der Methode. Braucht Arbeit für die Produktion, aber die Methode funktioniert wunderbar in dev, nur verwendet es für eine Person so weit.
Dieser Methode erstellt wurde, weil ich versucht bin, auf der Seite meine Daten auf der server-Ebene und eine ausgeprägte Ergebnis-Transformator nicht funktionieren würde.
Nachdem Sie Ihrem Objekt-Sammlung (Abfrage.Liste ()), die Sie haben können, um neu zu laden der Objekte zum Auffüllen einer zu viele untergeordnete Objekte enthalten sind. Viele zu eins-Zuordnungen werden Proxy für faule Lasten.
Code, den ich verwendet, um die Last auf viele Beziehungen... T ist der entity-Typ.
InformationsquelleAutor der Antwort longday