在实体结果集中搜索和替换

本文关键字:替换 搜索 集中 实体 结果 | 更新日期: 2023-09-27 18:28:41

给定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

目前,我分两步进行更换。首先,我得到所有需要的数据:

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);
    }
}

现在,除了任何数据库兼容性问题和可读性之外,是否可以在第一个数据库查询中执行搜索和替换?

在实体结果集中搜索和替换

真正有问题的是,您需要对同一变量应用多个替换,而我在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);
    }
}

目前尚不清楚哪些字段是主键,哪些字段是唯一的,但我相信,您应该能够找到一个单独的查询,该查询至少包含您需要处理的所有数据,并且可以避免进行第二个查询。您可能需要调整分组内容和分组依据。