Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从对象数组中获取键值对_C#_Arrays_.net_List_Linq - Fatal编程技术网

C# 如何从对象数组中获取键值对

C# 如何从对象数组中获取键值对,c#,arrays,.net,list,linq,C#,Arrays,.net,List,Linq,我在数据库里有两张桌子 表1“DocumentFieldValues”有两列FieldId和Value,以及 表2包含主键FieldId和FieldName的“字段” 我事先知道字段名,我想把它们做成一把钥匙。这里大约有100个键/值对 Attempt 1 var attempt1= db.DocumentFieldValues.Where(x => x.PolicyDocumentId == id).Include(x => x.Field ).ToList(); 尝试

我在数据库里有两张桌子 表1“DocumentFieldValues”有两列FieldId和Value,以及 表2包含主键FieldId和FieldName的“字段”

我事先知道字段名,我想把它们做成一把钥匙。这里大约有100个键/值对

Attempt 1 

   var attempt1= db.DocumentFieldValues.Where(x => x.PolicyDocumentId == id).Include(x => x.Field ).ToList();
尝试2

        var documentFieldValues = this.db.DocumentFieldValues.Where(x => x.PolicyDocumentId == id).ToArray();

        var bindingStringAndValue = from documentFieldValue in documentFieldValues
                       join field in this.db.Fields on documentFieldValue.FieldId equals field.FieldId
                       select new {  field.BindingString,  documentFieldValue.Value } ;
我基本上需要能够执行data.FieldName并在前端使用jQuery ajax调用检索值到后端,只需要以正确的格式将这些数据传回

非常感谢您的帮助

我刚做了这个,这个很有效,但这是最好的方法吗? 我只有4个月的工作经验,只有1年的自学,没有后端代码,所以不要讨厌lol,我觉得从性能角度看,这是非常糟糕的

    IDictionary<string, string> dict = new Dictionary<string, string>();

        foreach (var item in bindingStringAndValue)
        {
            dict.Add(item.BindingString, item.Value);
        }
IDictionary dict=new Dictionary();
foreach(bindingStringAndValue中的变量项)
{
dict.Add(item.BindingString,item.Value);
}
尝试4这是我现在遇到的最好的方式谢谢@Orel Eraki

var dict=db.DocumentFieldValues
.Where(dfv=>dfv.PolicyDocumentId==id)。包括(dfv=>dfv.Field)

.ToDictionary(dfv=>dfv.Field.BindingString,dfv=>dfv.Value)

你实际上做得很好

如果希望将值映射到
字典中,可以执行以下操作


如果一个表上最多有100个字段名,这意味着数据库设计完全错误。很可能是一个未解决的N:M关系。您应该花时间重新设计数据库,并通过视图支持旧方法。该表专门用于问题名称,另一个表用于与该问题名称关联的值。用户可以在另一个页面上为保险单创建与此及其罚款无关的问题。这两个问题都应该有效,请仔细检查是否将DocumentFieldValues.FieldId作为外键(其中引用Fields.FieldId)。如果不这样做,请更新您的edmx模型。@Orel Eraki是的,其他两个将获取正确的数据,但第一个将获取更多的数据,它将创建一个对象数组,然后每个对象中都有一个包含更多对象的数组。尝试2完全获取了我需要的内容,但我需要bindingstring的值成为键,value的值成为键的值,键是绑定字符串的类型confusing@JoshRice,好的,那么您想将值映射到
字典中。我已经提出了一个答案。非常感谢你,我知道有一个更好的方法可以做到这一点,而不是什么麻烦。但要考虑到这种方式在某种程度上是不同的,它更具表现力,更紧凑,变量更少。但是在good下,它们是相同的,因为您尝试生成IQueryable,所以当您实际迭代它时,它会生成您想要的项。基本上是一样的。
var dict = db.DocumentFieldValues
    .Where(dfv => dfv.PolicyDocumentId == id)
    .ToDictionary(dfv => dfv.Field.BindingString, dfv => dfv.Value);