Receiving data from a database and turning them into a dictionary

Why this function does not work:

   [HttpGet("getCustomerAsDict")]
    public async Task<object> GetCustomersAsDict()
    {
        var customOutPut = new Dictionary<int, string>();
        var customer = await _context.Customers.ToListAsync();
        foreach (var custom in customer)
        {
            customOutPut[custom.CustomerId] = custom.CustomerName;
        }
        return customOutPut;
    }

Postman throw: System.NotSupportedException: The collection type 'System.Collections.Generic.Dictionary`2[System.Int32,System.String]' is not supported.

status: 500 Internal Server Error

But this function does work:

  [HttpGet("getCustomerAsDict")]
    public async Task<object> GetCustomersAsDict()
    {
        var customOutPut = new Dictionary<string, int>();
        var customer = await _context.Customers.ToListAsync();
        foreach (var custom in customer)
        {
            customOutPut[custom.CustomerName] = custom.CustomerId;
        }
        return customOutPut;
    }

And Postman gives me the answer I needed


I just tested var customOutPut = new Dictionary<int, string>() dictionary and Posman returned the result

{
    "1": "cust1",
    "2": "cust2"
}

my controllers are configured to use Newtonsoft.Json and I guess it automatically converts int to string to create a valid json,

But this json is not valid

{
    1: "cust1",
    2: "cust2"
}

this is why you got an exception. I made some research and found that System.Text.Json: The collection type ‘System.Collections.Generic.Dictionary[System.Int32,System.String]is not supported is the common for net core 3.1-5.0. But it seems it is already fixed for net 6. If you use the earlier versions, it is recomended for Text.Json to create a custom DictionaryConverter as work around

but I personally would try this as a work around

var customOutPut = new Dictionary<string, string>();
     
foreach (var custom in customer)
  customOutPut.Add(custom.CustomerId.ToString(), custom.CustomerName);

after receiving data , you can convert customerId back to int. Your variant 2 maybe is not working properly, since a dicitionay key must be unique.

But if you try to get a dictionary value, it is still valid since it is not a json

var val=  customOutPut[1]; //cust1