0

3 つのデータベース テーブルがあるとします。

A (id, type, code, ...)
B (code, text)
C (id, key, val)

A.code == B.code
A.id == C.id (C.id is not a unique key, multiple entries are possible)

B.textには、 の形式で置換変数$KEY$含まれる場合があります。(したがって、たとえば、「This is a $SOMEKEY$」が含まれる場合があります。Cには、キーと置換値が含まれる場合があります

$SOMEKEY$: Message
$SOMEOTHERKEY$: Text

現在、交換は 2 段階で行っています。まず、必要なデータをすべて取得します。

var result = from a in context.A where a.type == myType
             join b in context.B on a.code == b.code
             select new {
                 ID = a.id,
                 Code = a.code,
                 Text = b.Text
             };

次に、一致する置換変数をすべて取得します。C で使用できるキーがない可能性があります。

var data = context.C.Where(c => result.Select(r => r.ID).Contains(c));

次に、リストをループして置換を実行します。

foreach (var r in result) {
    var local = r;
    foreach (var c in data.Where(c => c.id == local.ID)) {
        local.Text = local.Text.Replace(c.key, c.val);
    }
}

さて、データベースの互換性の問題と読みやすさは別として、最初のデータベース クエリ内で検索と置換を実行することは可能でしょうか?

4

1 に答える 1

0

本当に問題なのは、同じ変数に複数の置換を適用する必要があり、Linq でそれを行う方法が見当たらないことです。

ただし、できることは、2 つのクエリと foreach ループから 1 つのクエリと foreach ループに減らすことです。

// group by the replacement string and gather all the replacements
var result = from a in context.A
    join b in context.B on a.code equals b.code
    join c in context.C on a.id equals c.id
    group new {b.text, c.key, c.val} by b.code into grp
    select grp;


// loop through each group and apply replacements
foreach(var r in result) {
    var text = r.First().text;

    foreach(var c in r) {
        text = text.Replace(c.key, c.val);
    }
}

どのフィールドが主キーで、何が一意であるかは明確ではありませんが、少なくとも作業に必要なすべてのデータを含む単一のクエリを実行する方法を見つけることができるはずであり、回避できると思います2 番目のクエリを実行しています。グループ化する対象とグループ化する対象を調整する必要がある場合があります。

于 2013-08-24T21:48:58.607 に答える