Jeg kan sagtens mappe får countries til at virke, ved at lave new inde i mit linq udtryk. Dog er det cities, der driller en del. Jeg kan ikke få x.Cities over i Cities. Cities = x.cities.Select(c => new List<City>() ????
using System; using System.Collections.Generic; using System.Linq;
namespace E { public class DBCity { public string Name { get; set; } } public class DBCountry { public string Name { get; set; } public List<DBCity> Cities { get; set; } } public class City { public string Name { get; set; } } public class Country { public string Name { get; set; } public List<City> Cities { get; set; } } public class Program { public static void Main(string[] args) { List<DBCountry> dblst = new List<DBCountry> { new DBCountry { Name = "Denmark", Cities = new List<DBCity> { new DBCity { Name = "Copenhagen" }, new DBCity { Name = "Aarhus" } } }, new DBCountry { Name = "Sweden", Cities = new List<DBCity> { new DBCity { Name = "Stockholm" }, new DBCity { Name = "Malmoe" } } } }; foreach(DBCountry country in dblst) { Console.WriteLine(country.Name); foreach(DBCity city in country.Cities) { Console.WriteLine(" " + city.Name); } } List<Country> lst = dblst.Select(c => new Country { Name = c.Name, Cities = c.Cities.Select(c2 => new City { Name = c2.Name }).ToList() }).ToList(); foreach(Country country in lst) { Console.WriteLine(country.Name); foreach(City city in country.Cities) { Console.WriteLine(" " + city.Name); } } Console.ReadKey(); } } }
var countries = context.countries.Select(x => new Country { Id = (long?)x.Id, Name = x.Name, Cities = x.cities.Select(city => new City { /* Set properties*/}).ToList()).ToList();
Ah, dvs man ikke kan angive en "var countries =", men skal explicit angive typen -> dvs. "List<Country> countries =". Tror faktisk, jeg har haft dette problem før, men det blev lidt sent igår aftes.
Nah. Om du skriver "var" eller skriver typen giver samme resultat. Ved at angive typen er du bare sikker på det også er det du får retur. Ellers skal compileren nok brokke sig. Hvor ved "var" kunne du i princippet ende med en IEnumerable frem for en List (for lige at tage det som nok oftes sker).
Der er også lidt untagelser omkring implicit casts som kan ske hvis du angiver typen i stedet for at bruge var, men ikke noget der burde ske i denne sammenhæng.
Som du selv er inde på er det et nested udtryk. Derfor skal du også bruge en select inde i en select :-). Som ved den første select skal du også ved din "inner" select - selecte et "item" af gangen.
LINQ to Entities does not recognize the method 'System.Collections.Generic.List`1[Entities.City] ToList[City](System.Collections.Generic.IEnumerable`1[Entities.City])' method, and this method cannot be translated into a store expression.
Jeg læste et sted at man ikke kan lave en 'ToList()' i en 'ToList()'. Det er et Linq udtryk jeg laver i forbindelse med Entity Framework 5.0. Helt sikkert det der driller.
Ja, jeg har gjort det masser af gange før, uden at have problemer med nestede linq udtryk, men her tror jeg den ikke kan oversætte mit udtryk til en query imod min db. Er ret sikker på det er EF, der driller her...
En hvor du selecter det du skal bruge og efterfølgende parser det over i dene egne objekter.
//Del1 hent hvad der skal bruges fra databasen til momory var countries = context.countries.Select(x=> new {Id = (long?)x.Id, Name = x.Name, Cities = x.Cities}).ToList() //Husk at lave filter her inden tolist efter tolist ligger det hele i memory og er ikke længere en query der senere bliver eksekveret på databasen.
//Del2 Parse til egne objekter .Select(x => new Country { Id = x.Id, Name = x.Name, Cities = x.Cities.Select(city => new City { /* Set properties*/}).ToList()}).ToList();
Igen overstående er ikke testet og kan sikkert også laves smartere, men lige den umiddelbare løsning jeg kan komme på.
public Country(IEnumerable<City> cities) { Cities = cities.ToList(); } public string Name { get; set; } public List<City> Cities { get; set; } }
var countries = context.countries.Select(x => new Country(x.cities.Select(city => new City { /* Set properties*/})) { Id = (long?)x.Id, Name = x.Name}).ToList();
Det er lidt et skud. Ved at være længe siden jeg har arbejdet med EF og er ikke sikker på den går.
Eller bare ændre propertien fra list til enumerable hvis det er acceptabelt.
Denne version virke, men giver mig kun een city i min cities collection:
List<Country> countries = context.countries.Select(x => new Country { Name = x.Name, Cities = new List<City> { x.cities.Select(c => new City { Id = c.Id, Name = c.Name }).FirstOrDefault() } }).ToList();
Jes overstående selecter du alle cities men slutter med kun at tage den første. Du burde kunne smide din IEnumerable ind i din listes contructor i stedet:
List<Country> countries = context.countries.Select(x => new Country { Name = x.Name, Cities = new List<City>(x.cities.Select(c => new City { Id = c.Id, Name = c.Name })) }).ToList();
Jeg fik det til at virke med følgende: mycontext.countries.Select(x => new Country { Id = (long?)x.Id, Name = x.Name, Iso = x.ISO, Cities = x.cities.Select(c => new City{ Id = c.Id, Name = c.Name})}).ToList()
dblst.Select(c => new Country { Name = c.Name, Cities = c.Cities.Select(c2 => new City { Name = c2.Name }).ToList() }).ToList()
og:
mycontext.countries.Select(x => new Country { Id = (long?)x.Id, Name = x.Name, Iso = x.ISO, Cities = x.cities.Select(c => new City{ Id = c.Id, Name = c.Name})}).ToList()
ser ens nok ud til at jeg toer smide et svar.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.