Ik probeer winkels te selecteren met een lambda-functie en het resultaat te converteren naar een SelectListItem zodat ik het kan renderen. Het geeft echter de foutmelding “Type expressie in Select Clause is Incorrect“:
IEnumerable<SelectListItem> stores =
from store in database.Stores
where store.CompanyID == curCompany.ID
select (s => new SelectListItem { Value = s.ID, Text = s.Name} );
ViewBag.storeSelector = stores;
Wat doe ik verkeerd?
BEWERKEN:
Ook, hoe converteer ik Int naar String in deze situatie? Het volgende werkt niet:
select (s => new SelectListItem { Value = s.ID.ToString(), Text = s.Name} );
select (s => new SelectListItem { Value = s.ID + "", Text = s.Name} );
BEWERK 2:
Bepaal de conversie van Int naar String. Het is zo typerend voor Microsoft om te vergeten een int2string-conversiefunctie op te nemen. Hier is de daadwerkelijke oplossing die iedereen gebruikt, met volledig werkende syntaxis:
select new SelectListItem { Value = SqlFunctions.StringConvert((double)store.ID), Text = store.Name };
Deze situatie absurd noemen is een understatement.
Antwoord 1, autoriteit 100%
met behulp van LINQ-queryexpressie
IEnumerable<SelectListItem> stores =
from store in database.Stores
where store.CompanyID == curCompany.ID
select new SelectListItem { Value = store.Name, Text = store.ID };
ViewBag.storeSelector = stores;
of met behulp van LINQ-extensiemethoden met lambda-expressies
IEnumerable<SelectListItem> stores = database.Stores
.Where(store => store.CompanyID == curCompany.ID)
.Select(store => new SelectListItem { Value = store.Name, Text = store.ID });
ViewBag.storeSelector = stores;
Antwoord 2, autoriteit 16%
Waarom niet gewoon alle Lambda-syntaxis gebruiken?
database.Stores.Where(s => s.CompanyID == curCompany.ID)
.Select(s => new SelectListItem
{
Value = s.Name,
Text = s.ID
});
Antwoord 3, autoriteit 13%
Het lijkt erop dat u de syntaxis van query-expressies probeert te combineren met de “normale” syntaxis van lambda-expressies. U kunt het volgende gebruiken:
IEnumerable<SelectListItem> stores =
from store in database.Stores
where store.CompanyID == curCompany.ID
select new SelectListItem { Value = store.Name, Text = store.ID};
ViewBag.storeSelector = stores;
Of:
IEnumerable<SelectListItem> stores = database.Stores
.Where(store => store.CompanyID == curCompany.ID)
.Select(s => new SelectListItem { Value = s.Name, Text = s.ID});
ViewBag.storeSelector = stores;
Je kunt de twee niet combineren zoals je probeert.
Antwoord 4, autoriteit 4%
Lambda-expressieresultaat
var storesList = context.Stores.Select(x => new { Value= x.name,Text= x.ID }).ToList();
Antwoord 5
Lambda-expressies gebruiken:
-
Als we geen specifieke klasse hebben om het resultaat te binden:
var stores = context.Stores.Select(x => new { x.id, x.name, x.city }).ToList();
-
Als we een specifieke klasse hebben, moeten we het resultaat ermee binden:
List<SelectListItem> stores = context.Stores.Select(x => new SelectListItem { Id = x.id, Name = x.name, City = x.city }).ToList();
Eenvoudige LINQ-uitdrukkingen gebruiken:
-
Als we geen specifieke klasse hebben om het resultaat te binden:
var stores = (from a in context.Stores select new { x.id, x.name, x.city }).ToList();
-
Als we een specifieke klasse hebben, moeten we het resultaat ermee binden:
List<SelectListItem> stores = (from a in context.Stores select new SelectListItem{ Id = x.id, Name = x.name, City = x.city }).ToList();