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

标签 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”但值正确的单元格。

将我与第二个表联合,“调整器”(与“选择器”的格式相同,但键有 _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);

}

谢谢^_^

最佳答案

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

DefaultIdEmpty 键有“+=”但应该只是 + >_<

关于c# - 为什么我从 GroupJoin 中得到如此奇怪的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36618170/

相关文章:

c# - 不能使用三元运算符给 Linq 表达式赋值

xml - 将 System.Xml.Linq 与单声道命令行编译器一起使用

c# - DataTable 中的分组数据

c# - LINQ 中的 order by 问题

c# - LINQ-to-SQL 在动态列上搜索?

c# 如何使用 Microsoft Graph API 获取 Office 365 用户照片

c# - C# 中对象的有效 JSON

c# - 我丢失了 Visual Studio C# 2008 的设计 View

c# - 如何将字符串列表数据绑定(bind)到 WPF/WP7 中的 ListBox?

C# 显示带有 WS_EX_NOACTIVATE 标志的表单