2013-03-22 41 views
42

我想选择使用lambda函数的商店并将结果转换为SelectListItem,以便我可以呈现它。但是它抛出一个“类型的表达式在SELECT子句中是不正确的”错误:如何在LINQ select语句中使用Lambda

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; 

我在做什么错?

编辑:

此外,如何将int转换为字符串在这种情况下?以下不工作:

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

编辑2:

找出诠释到String的转换。忘记包含int2string转换函数是微软的典型做法。下面是实际的解决办法大家都在用,与完全工作的语法:

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

要调用这个情况荒谬是轻描淡写。

回答

90

使用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; 

或使用LINQ扩展方法与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; 
+1

能否请你帮我int转换成字符串? LINQ to Entity似乎没有办法将int转换为字符串。 – Bill 2013-03-22 19:14:16

+0

@YongkeBillYu你的意思是像'5.ToString()'? – 2013-03-22 19:17:44

+0

是的,这显然不起作用。 – Bill 2013-03-22 19:19:45

14

您似乎试图混合查询表达式语法和“普通”lambda表达式语法。您可以使用:

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; 

或者:

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

像你想你不能混用两种。

14

为什么不使用所有的Lambda语法?

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