Active Query (Castle, Performance)
-
06-07-2019 - |
Frage
Ich habe 3 Tabellen:
- Parts :
Name
: interner Name,Active
: bool - Sprachen : Liste der Sprachen (Englisch, Französisch, Deutsch, ....)
- PartsTranslations :.
RealName
und IDs der anderen zwei Tabellen
Ich mochte eine Liste bekommen von Parts Sie mir den internen name
sagen, active
Status und , wie viele Übersetzungen fehlen (insgesamt lang subtrahieren Übersetzungen gemacht)
Ich habe diese SQL-Abfrage, die mir gibt, was ich brauche (ich weiß nicht, ob dies der bessere Weg ist es zu machen oder nicht, aber es funktioniert):
SELECT
parts1.name,
parts1.active,
(
(SELECT count(lang.id)
FROM languages AS lang)
-
(SELECT count(trans.id)
FROM parts AS parts2
INNER JOIN partstranslations as trans
ON parts2.id = trans.partid
WHERE parts2.id = parts1.id)
)
from parts as parts1;
1º Frage -? Wie kann ich diese Abfrage mit Schloss Active machen
2e Frage -? Wie ist die Leistung der letzten Abfrage (teure)
Danke
Lösung
Ich war in der Lage, diese Abfrage in Active mit HqlBasedQuery
zu machen, so poste ich hier die Antwort andere in der gleichen Situation wie mir zu helfen.
HqlBasedQuery query = new HqlBasedQuery(typeof(Part),
@"
SELECT
par.Id,
par.Name,
par.Active,
(SELECT count(*) - count(trans) FROM Language)
FROM Part par
LEFT JOIN par.PartsTranslations trans
GROUP BY par.Id, par.Name, par.Active, trans.Part
");
query.SetQueryRange(startId, currentPageSize);
var results = from object[] summary in
(ArrayList)ActiveRecordMediator.ExecuteQuery(query)
select new PartProjection
{
Id = (int)summary[0],
Name = (string)summary[1],
Active = (bool)summary[2],
TransMissing = (long)summary[3]
};
ich auch Paginierung auf dieser Abfrage gemacht haben, und es gibt mir auch ein stronged getippt PartProjection
Objekte. Diese Klasse enthält KEINE Active Parameter haben müssen.
Andere Tipps
Ich kann nicht mit Active helfen, aber diese Abfrage sollte mit einer korrelierten Unterabfrage besser als das durchzuführen.
SELECT
p.name,
p.active,
(SELECT count(*) FROM languages) - count(pt.divid)
FROM
Parts p
LEFT JOIN PartsTranslations pt ON p.id=pt.divid
GROUP BY p.id, p.name, p.active
Oder, wenn Sie die korrelierte Unterabfrage verwenden wollen, müssen Sie nicht wieder in ihr von Parts
wählen:
SELECT
p.name,
p.active,
(SELECT count(*) FROM Languages) -
(SELECT count(*) FROM PartsTranslations WHERE divid = p.id)
FROM Parts p;