webForumDet fria alternativet

order by enligt "in-parameters" i nhibernate

.NET

4 svar · 636 visningar · startad av doggelito

Medlem sedan juni 20003 076 inlägg
Frågan#1

Hej, går det på nått fiffigt sätt att sätta en order by enligt de värden som skickas in i selecten?

public IList<Unit> GetUnits(Guid[] units)
{
            IList<Unit> result;

            StringBuilder sb = new StringBuilder();
            sb.Append("select u from Unit u where u.ID in (:Units) ");
           
            using (var tx = NHibernateHelper.GetCurrentSession().BeginTransaction())
            {           
                NHibernate.IQuery query = NHibernateHelper.GetCurrentSession()
                       .CreateQuery(sb.ToString());

                query.SetParameterList("Units", units);
                result = query.List<Unit>();

                tx.Commit();
            }

            return result;
}

Här vill jag få tillbaka IList:en i samma ordning som units skickas in.
Som det är nu så verkar nhibernate skicka tillbaka i egen random ordning!

Medlem sedan aug. 20003 575 inlägg
#2

Tror inte det går, men du kan ju lägga på en sorteringsalgorithm i efterhand på resultatet.

Medlem sedan juni 20003 076 inlägg
#3

Mm, jag nästan antog att jag skulle få ett sådant svar! ;)

I ren sql så skulle man kunna skapa en tmp tabell som man lägger in värdena i och sedan joinar och sätter orderby enligt den tabellen. Skulle det gå att göra i hql kod eller är man tvingad till att bygga en stored procedure då tror du?

Medlem sedan jan. 20023 327 inlägg
#4

Flyttad från: Webbutveckling > ASP.NET

Medlem sedan juli 2003555 inlägg
#5

Är det stora mängder data? Om det är mindre mängder data så är det nog överlägset bäst att göra den sorteringen i .NET och ej i databasservern. Ett förslag på sådan lösning är:

Unit[] sortedResult = new Unit[units.Count];
foreach(Unit u in result)
{
sortedResult[units.IndexOf(u.MinNyckel)] = u;
}
return new List<Unit>(sortedResult);

Enkel förklaring: skapar array med rätt storlek, går igenom varje resultat, tar reda på originalindex i parameterlistan, och stoppar sedan in objektet på det indexet i arrayen.

252 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)