C# - 从数据库中检索数据并存储在二维字典中?

时间:2017-09-17 02:25:57

标签: c# asp.net database linq dictionary

你好我尝试做一些像 PHP 这样的东西,它是从数据库中检索数据并存储在二维集合(Dictionary)中 我不确定我是否写得正确。

假设我的数据库表和预期的结构结果如下所示(参见屏幕截图)

Click to see screenshot

public ActionResult ShowBook()
{          
         var books = from v in db.Books
                        select v;

         Dictionary<string, Dictionary<string, string>> test = new Dictionary<string, Dictionary<string, string>>();
         foreach (var item in books)
         {

             test[item.Book_Type_ID][item.Author_ID] = item.Book_Name;
         }

         return .....

}

但我有这个错误

System.Collections.Generic.KeyNotFoundException:'字典中没有给定的密钥。'

我该怎么办?

2 个答案:

答案 0 :(得分:2)

字典是二维的。初始化时

Dictionary<string, Dictionary<string, string>> test = new Dictionary<string, Dictionary<string, string>>();

初始化第一维,但不是第二维 - 即test是空字典。因此,当您尝试将书名添加到第二维词典时,还没有要添加到其中的词典。您需要首先检查此条件,并创建一个条目(如果该条目尚不存在):

var books = from v in db.Books select v;

Dictionary<string, Dictionary<string, string>> test = new Dictionary<string, Dictionary<string, string>>();
foreach (var item in books)
{
    if (!test.ContainsKey(item.Book_Type_ID))
        test[item.Book_Type_ID] = new Dictionary<string, string>();

    test[item.Book_Type_ID][item.Author_ID] = item.Book_Name;
}

答案 1 :(得分:2)

问题是,在为外部字典分配新密钥时,必须初始化每个内部Dictionary<string, string>。通常,这意味着检查此密钥是否存在,如果不存在,则创建对象:

foreach (var item in books)
{
      if(!test.ContainsKey(item.Book_Type_ID))
      {
           test[item.Book_Type_ID] = new Dictionary<string, string>();
      }

      //now we are sure it exists, add it     
      test[item.Book_Type_ID][item.Author_ID] = item.Book_Name;
}