web-dev-qa-db-fra.com

Comment utiliser Lambda dans l'instruction de sélection LINQ

J'essaie de sélectionner des magasins à l'aide d'une fonction lambda et de convertir le résultat en un SelectListItem afin de pouvoir le restituer. Cependant, il génère une erreur "le type d'expression dans la clause choisie est 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;

Qu'est-ce que je fais mal?

MODIFIER:

Aussi, comment convertir Int en String dans cette situation? Ce qui suit ne fonctionne pas:

select (s => new SelectListItem { Value = s.ID.ToString(), Text = s.Name} );
select (s => new SelectListItem { Value = s.ID + "", Text = s.Name} );

EDIT 2:

Calculez la conversion Int en chaîne. Il est tellement typique de Microsoft d’oublier d’inclure une fonction de conversion int2string. Voici la solution de contournement utilisée par tout le monde, avec une syntaxe parfaitement fonctionnelle:

select new SelectListItem { Value = SqlFunctions.StringConvert((double)store.ID), Text = store.Name };

Dire que cette situation est absurde est un euphémisme.

54
Bill

en utilisant l'expression de requête LINQ

 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;

ou en utilisant des méthodes d'extension LINQ avec des expressions lambda

 IEnumerable<SelectListItem> stores = database.Stores
        .Where(store => store.CompanyID == curCompany.ID)
        .Select(store => new SelectListItem { Value = store.Name, Text = store.ID });

 ViewBag.storeSelector = stores;
112
Russ Cam

Pourquoi ne pas simplement utiliser toute la syntaxe Lambda?

database.Stores.Where(s => s.CompanyID == curCompany.ID)
               .Select(s => new SelectListItem
                   {
                       Value = s.Name,
                       Text = s.ID
                   });
17
Justin Niessner

Vous semblez essayer de mélanger la syntaxe d'expression de requête et la syntaxe d'expression "normale". Vous pouvez soit utiliser:

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;

Ou:

IEnumerable<SelectListItem> stores = database.Stores
        .Where(store => store.CompanyID == curCompany.ID)
        .Select(s => new SelectListItem { Value = s.Name, Text = s.ID});
ViewBag.storeSelector = stores;

Vous ne pouvez pas mélanger les deux comme vous essayez.

16
Jon Skeet

Résultat de l'expression lambda

var storesList = context.Stores.Select(x => new { Value= x.name,Text= x.ID }).ToList();
3
Gurbaksh Singh