ActiveRecordクエリ(城、パフォーマンス)
-
06-07-2019 - |
質問
3つのテーブルがあります:
- パーツ:
Name
:内部名、Active
:bool - 言語:言語のリスト(英語、フランス語、ドイツ語、...)
- PartsTranslations :
RealName
および他の2つのテーブルのID。
部品のリストを取得して、内部の name
、 active
ステータスおよびを教えてください多くの翻訳が欠落しています(言語ごとに翻訳を差し引く)
必要なものを提供するこのSQLクエリを作成しました(これがより良い方法であるかどうかはわかりませんが、機能しています):
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º question- Castle ActiveRecordを使用してこのクエリを作成するにはどうすればよいですか
2º質問-最終的なクエリ(高価なクエリ)のパフォーマンスはどうですか?
ありがとう
解決
HqlBasedQuery
を使用してActiveRecordでこのクエリを作成できたので、私と同じ状況で他の人を助けるためにここに答えを投稿します。
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]
};
このクエリのページネーションも行っています。また、強力な型指定された PartProjection
オブジェクトも提供します。このクラスには、ActiveRecordパラメーターは必要ありません。
他のヒント
ActiveRecordを使用することはできませんが、このクエリは相関サブクエリを使用するクエリよりも優れたパフォーマンスを発揮するはずです。
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
または、相関サブクエリを使用する場合、その中の Parts
を再度選択する必要はありません。
SELECT
p.name,
p.active,
(SELECT count(*) FROM Languages) -
(SELECT count(*) FROM PartsTranslations WHERE divid = p.id)
FROM Parts p;
所属していません StackOverflow