将字典列表转换为模型

3
我有一个包含多个表联接的数据库中行的Dictionary列表。我尝试了各种LINQ方法,但总是遇到以这种数据结构无法进行某些操作的障碍。我已经尽力简化代码示例,而不会误传核心问题,那么...
我该如何从List中提取Dictionary中的显式KeyValuePairs并将其放入Model中?
我需要一个可扩展的解决方案,其中Model可以对subData执行相同的操作。
public class Program
{
    public static void Main(string[] args)
    {
        List<Dictionary<string, string>> data = GetData();
        data.Add(new Dictionary<string, string>() { ["modelData"] = "Bob", ["subModelData"] = "Frank" });
        data.Add(new Dictionary<string, string>() { ["modelData"] = "Nancy", ["subModelData"] = "Boy" });
        List<Model> models = new List<Model>();
        //Fails in this linq statement. Anonymous types don't allow key accessors
        foreach (Dictionary<string, string> distinctModel in data.GroupBy(x => new { x["dataKey"] }))
        {
            List<Dictionary<string, string>> newModelData = data.Where(d => d["data1Key"] == distinctModel["dataKey"]).ToList();
            Model newModel = new Model(newModelData);
            models.Add(newModel);
        }
    }
}

public class Model
{
    public string modelData;
    public List<Dictionary<string, string>> subData;

    public Model(List<Dictionary<string, string>> data) {
        modelData = data[0]["dataKey"];
        data.Remove("dataKey");
        subData = data;
    }
}

.GroupBy(x => new { x.GetValue("dataKey") }) 改为这个吗? - Thomas Ayoub
你是指的TryGetValue()吗?但这仍然不是一个简单的名称或成员访问。 - Thor
1
@Thor - 你能展示一些样本数据吗?这将使你试图实现什么更清晰明了。 - Gilad Green
鉴于你的问题陈述,很难建议一个“可扩展”的解决方案。乍一看,你的代码样本复杂度似乎不太优化。也就是说,如果你真的想让它运行得更快,你可能需要重新思考你的方法。 - ssis_ssiSucks
该列表可能包含35k+个字典,每个字典都有相同数量的键值对(34个),因此数据量很大。在这个问题陈述中,主要问题(试图限制范围)是避免重复项并正确表示父<->子关系。 - Thor
1个回答

4
匿名类型投影初始化器应该是一个简单的名称或成员访问。因此,您需要添加一个显式的名称,如下所示:
data.GroupBy(x => new {S = x["dataKey"] })

1
我想澄清一下,如果在匿名类型投影中表示的不是属性本身,那么需要显式指定名称,否则名称可以被推断。 - David L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接