私は、ユーザーがワークフローの一環として「コンポーネント」にタグを付けることができるアプリケーションに取り組んでいます。多くの場合、それらはお互いの同義語であるいくつかのタグで終わる。彼らは、これらをグループ化して、1つのタグがコンポーネントに追加されたときに、そのグループの残りのタグも追加できるようにします。双方向関係のテーブルを別々のグループに分割する
タググループをグループ内の各タグペア間の双方向関係に分割することに決めました。
ID TagID RelatedTagID
1 1 2
2 2 1
基本的には、グループは、その中に各タグのデカルト積として表される:グループは、タグ1と2を持っているのであれば、このようになりますレコードがあります。 3つのタグにそれを拡張:
ID Name
1 MM
2 Managed Maintenance
3 MSP
私たちの関係は次のようになります。
ID TagID RelatedTagID
1 1 2
2 2 1
3 1 3
4 3 1
5 2 3
6 3 2
私はグループ一緒にカップルのメソッドを持っていますが、彼らは恒星未満です。まず、私は、そのグループ内のタグのリストとともに、各タグを一覧表示ビューを書いた:
SELECT
TagKey AS ID,
STUFF
((SELECT ',' + cast(RelatedTagKey AS nvarchar)
FROM RelatedTags rt
WHERE rt.TagKey = t.TagKey
FOR XML PATH('')), 1, 1, '') AS RelatedTagKeys
FROM (
SELECT DISTINCT TagKey
FROM RelatedTags
) t
これに伴う問題は、その中にタグがあるとして、各グループが、結果に何度でも表示されていることです私は単一のクエリで対処する方法を考えることができませんでした。だから、私に戻っています:
ID RelatedTagKeys
1 2,3
2 1,3
3 1,2
はその後、私のバックエンドでは、私は別のグループで発生するキーが含まれているすべてのグループを破棄する。タグは複数のグループに追加されているわけではありませんが、そのように機能していますが、無関係なデータがどれくらい残っているのが好きではありません。
私が思い描いた2番目の解決策は、このLINQクエリでした。タグをグループ化するために使用されるキーは、グループ自体のリストです。これはおそらく私が元々考えていたよりもはるかに悪いでしょう。
from t in Tags.ToList()
where t.RelatedTags.Any()
group t by
string.Join(",", (new List<int> { t.ID })
.Concat(t.RelatedTags.Select(i => i.Tag.ID))
.OrderBy(i => i))
into g
select g.ToList()
私は本当にstring.Join
を呼び出した結果によってグループ化する嫌いが、私はちょうどキーのリストによってグループ化しようとしたとき、それは自分自身でグループ内の各タグを入れて、適切にグループではありませんでした。また、生成されたSQLはモンスターです。私はここに貼りつけるつもりはありませんが、LINQPadは、私のテストデータベース上に約12,000行の個別SELECT文を生成することを示しています(関連タグには1562個のタグと67個のレコードがあります)。
これらのソリューションは機能しますが、かなり単純で非効率的です。私はこれと一緒にどこに行くのか分からない。何か案は?
期待される結果は何ですか?あなたの質問からはそれほど明確ではありません。 – wdosanjos
申し訳ありませんが、私は恐れていたことが起こるかもしれません。私の例には1つのグループがあり、期待される結果はそのグループを関係のリストから派生させることです。もちろん、それは複数のグループでうまくいくはずですが、私の質問はもっと冗長になります。 –