2012-02-26 5 views
7

continuación del tema How get array in linq to entity?Recibe el diccionario <int, string> de linq a entidad?

pero ahora no es array => diccionario de ciudad es Diccionario

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() 
         }); 

actualización:

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

¿Cuál es la definición de la propiedad de la ciudad en SitiesViewByUser? – devdigital

+0

Actualizo mi publicación – Mediator

+0

¿De dónde viene la clave int del Dictionary? ¿Es esta la clave principal de la ciudad? No está recuperando esto en su consulta inicial LINQ to Entities. – devdigital

Respuesta

9

Puede utilizar ToDictionary para crear un diccionario de una Secuencia LINQ.

La primera parte es la clave, y la segunda el valor, P. ej.

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

Esto supone que City en SitiesViewByUser se define como Dictionary<string, string>

Su LINQ es bastante confuso sin embargo. Está creando un tipo anónimo, con el objetivo de dar forma a un Country, pero que tiene una propiedad Country, que de hecho es el Title del país (¿ese es el nombre del país?).

También tiene una colección de solo la ciudad Titles, así que no estoy seguro de qué valor va a utilizar en su diccionario City en su tipo SitiesViewByUser.

Además, ¿qué es un Sitie? : \

actualización

Se podría hacer algo como esto:

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) 
    }; 

Por otra parte, ¿por qué no cambiar el tipo de SitiesViewByUser ser:

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

A continuación, puede hacer (usando sintaxis fluida):

var sitiesViewByUsers = db.Countries.Select(c => new SitiesViewByUser 
    { 
    Country = c.Title, 
    Cities = c.Cities 
    }); 
+0

Actualizo mi publicación – Mediator

Cuestiones relacionadas