Hoe Lambda te gebruiken in LINQ select statement

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:

  1. 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();
    
  2. 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:

  1. 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();
    
  2. 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();
    

Other episodes