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

时间:2013-08-22 11:56:03

标签: c# linq entity-framework

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

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

1 个答案:

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

目前尚不清楚确切哪些字段是主键以及哪些字段是唯一的,但我相信您应该能够找到一个单独的查询,该查询至少会包含您需要使用的所有数据。你可以避免做第二次查询。您可能需要调整分组的内容以及分组的内容。