为什么我从GroupJoin得到如此奇怪的结果?

时间:2016-04-14 08:55:19

标签: c# linq

我如何解释(严重?)?

我有一个名为“规则”的实体,它是一些用于从POCO []中挑选项目的“选择器”。有一定数量的字段可供选择。所有这些都在我的数据库对象中详细说明。

我需要在网格中显示规则,每个规则都是一行,POCO中的每个字段都是一列。有些单元格会包含一个选择器,有些则不会。

我选择使用fields.groupJoin(selectors.defaultIfEmpty)来获取我需要的单元格内容:

var keyValuesS =
    fields
      .GroupJoin(
          SelectorView.Search(new SelectorViewFilter { RuleId = rule.Id }),
          f => f.Id,
          s => s.FieldId,
          (f, g) => g
            .Select(s => new { 
                key = f.Name + "_S", 
                value = GetToString(f, s) //gets the cell content html
            })
      .DefaultIfEmpty(new { 
                key = f.Name += "_S", 
                value = "<div style='position:relative;height:100%;width:100%'></div>" }) //empty cell
                )
      .SelectMany(g => g)
      .ToDictionary(f => f.key, f => f.value);

我期望的是一个字典,每个字段的键为'[field] _S',值为完整的单元格内容或默认的空单元格。

我实际得到的是具有选择器的单元格为'[field] _S_S'但值正确。

在第二个表格中加入我联盟,'adjusters'(与'选择器'格式相同,但键有_A)然后我得到了各种各样的混乱。为了在伤口擦盐,我自己的代码一直叫我_A_S_S!

之前我有一个类似的格式,但它的长度是10倍,创建了html但是有效。现在我已经重构了,相同的逻辑不再有效。

我确信我必须在代码中看不到简单的错误。请告诉我,这样我可能会感到尴尬,然后继续进行项目^ _ ^

仅供参考:这是包含工会的方法:

public static EditableRule PopulateByRule(Rule rule, Field[] fields)
{
    var keyValuesA =
        fields
            .GroupJoin(
                AdjustmentView.Search(new AdjustmentViewFilter { RuleId = rule.Id }),
                f => f.Id,
                a => a.FieldId,
                (f, g) => g
                    .Select(a => new { key = f.Name + "_A", value = GetToString(f, a) })
                    .DefaultIfEmpty(new { key = f.Name += "_A", value = "<div style='position:relative;height:100%;width:100%'></div>" })
            )
            .SelectMany(g => g);
    var keyValuesS =
        fields
            .GroupJoin(
                SelectorView.Search(new SelectorViewFilter { RuleId = rule.Id }),
                f => f.Id,
                s => s.FieldId,
                (f, g) => g
                    .Select(s => new { key = f.Name + "_S", value = GetToString(f, s) })
                    .DefaultIfEmpty(new { key = f.Name += "_S", value = "<div style='position:relative;height:100%;width:100%'></div>" })
            )
            .SelectMany(g => g);
    var keyValuesBoth = keyValuesA.Union(keyValuesS);

    var dictionary = keyValuesBoth.ToDictionary(f => f.key, f => f.value);

    return new EditableRule(rule.Id, rule.DisplayText, dictionary);

}

谢谢^ _ ^

1 个答案:

答案 0 :(得分:1)

我刚刚发现了我的愚蠢错误

DefaultIdEmpty键有&#34; + =&#34;但应该只是+&gt; _&lt;