Получить словарь <int, string> от linq до сущности? - PullRequest
7 голосов
/ 26 февраля 2012

продолжение вопроса Как получить массив в linq to entity?

но теперь это не массив => словарь Тип города - Словарь

 var sites = (from country in db.Countries
                        select new
                        {
                            Country = country.Title,
                            Cities = country.Cities.Select(m => m.Title)
                        })
                        .AsEnumerable()
                        .Select(country => new SitiesViewByUser()
                        {
                            Country = country.Country,
                            City = country.Cities.ToArray()
                        });

Обновление:

public class SitiesViewByUser
    {
        public string Country { get; set; }
        public Dictionary<int, string> City { get; set; }
    }

1 Ответ

9 голосов
/ 26 февраля 2012

Вы можете использовать ToDictionary для создания словаря из последовательности LINQ.

Первая часть - это ключ, а вторая - значение, например,

.Select(country => new SitiesViewByUser()
{
    Country = country.Country,
    City = country.Cities.ToDictionary(c => c, c => c);
});

Это предполагает, что City на SitiesViewByUser определяется как Dictionary<string, string>

Хотя ваш LINQ довольно запутанный.Вы создаете анонимный тип, предположительно для формирования Country, но с атрибутом Country, который влияет на Title страны (это название страны?).

У вас также есть коллекция только города Titles, поэтому я не уверен, какое значение вы собираетесь использовать в словаре City для типа SitiesViewByUser.

Кроме того, что такое Сити?: \

Обновление

Вы можете сделать что-то вроде этого:

var countries = (from country in db.Countries
   select new
   {
     Title = country.Title,
     CityIds = country.Cities.Select(c => c.Id),
     CityTitles = country.Cities.Select(c => c.Title)
   }).AsEnumerable();

// You have a collection of anonymous types at this point, 
// each type representing a country
// You could use a foreach loop to generate a collection 
// of SitiesViewByUser, or you could use LINQ:

var sitiesViewByUsers = countries.Select(c => new SitiesViewByUser
   {
      Country = c.Title,
      City = c.CityIds.Zip(c.CityTitles, (k, v) => new { Key = k, Value = v })
               .ToDictionary(x => x.Key, x => x.Value)
   };

В качестве альтернативы, почему бы вам не изменить тип SitiesViewByUserбыть:

public class SitiesViewByUser
{
    public string Country { get; set; }
    public IEnumerable<City> Cities { get; set; }
}

Тогда вы можете сделать (используя свободный синтаксис):

var sitiesViewByUsers = db.Countries.Select(c => new SitiesViewByUser
  {
    Country = c.Title,
    Cities = c.Cities
  });   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...