给出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$
。 (例如,它可能包含:“这是$ SOMEKEY $”。C 可能 包含密钥和替换值:
$SOMEKEY$: Message
$SOMEOTHERKEY$: Text
目前,我分两步执行更换。首先,我获得了所有必需的数据:
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);
}
}
现在,除了任何数据库兼容性问题和可读性之外,是否可以在第一个数据库查询中执行搜索和替换?
答案 0 :(得分:0)
真正有问题的是你需要在同一个变量上应用多个替换,我无法在Linq中看到这样做的方法。
但是,你可以做的是将它从两个查询和foreach循环减少到一个查询和一个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);
}
}
目前尚不清楚确切哪些字段是主键以及哪些字段是唯一的,但我相信您应该能够找到一个单独的查询,该查询至少会包含您需要使用的所有数据。你可以避免做第二次查询。您可能需要调整分组的内容以及分组的内容。