2013-03-22 56 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 
        });