2016-12-16 232 views
0

我有這個linq查詢正在進行選擇,然後嘗試總和總計,所以在每個組鍵下都有一個總和。該值是一個字符串,我不能總結一個字符串。但是當我嘗試轉換爲int時,出現錯誤:LINQ將字符串轉換爲int

LINQ to Entities不識別方法'Int32 ToInt32(System.String)'方法,並且此方法無法轉換爲存儲表達式。

var dataSet = entities.BL_MT_CATEGORY 
      .Distinct() 
      .Where(d => (iGeography.FirstOrDefault() == "" || iGeography.Contains(d.Geography)) 
      && (iRetailer.FirstOrDefault() == "" || iRetailer.Contains(d.Retailer)) 
      && (iCountry.FirstOrDefault() == "" || iCountry.Contains(d.Country)) 
      && (iAirport.FirstOrDefault() == "" || iAirport.Contains(d.Airport)) 
      && (iShop.FirstOrDefault() == "" || iShop.Contains(d.StoreName)) 
      && (iCategory.Contains(d.Category)) 
      && (d.Values == "Sum of EuroValue")) 
      .GroupBy(x => x.Category) 
      .Select(g => new { 
       C201408 = g.Sum(x => Convert.ToInt32(x.C201408)) 
      }) 
      .ToList(); 
+0

@vendettamit'string'和'int'之間沒有明確的轉換。 – Abion47

+0

使用實體框架功能, –

回答

1

嘗試移動查詢以外的轉換。

var dataSet = entities.BL_FERRERO_MT_CATEGORY 
     .Distinct() 
     .Where(d => (iGeography.FirstOrDefault() == "" || iGeography.Contains(d.Geography)) 
     && (iRetailer.FirstOrDefault() == "" || iRetailer.Contains(d.Retailer)) 
     && (iCountry.FirstOrDefault() == "" || iCountry.Contains(d.Country)) 
     && (iAirport.FirstOrDefault() == "" || iAirport.Contains(d.Airport)) 
     && (iShop.FirstOrDefault() == "" || iShop.Contains(d.StoreName)) 
     && (iCategory.Contains(d.Category)) 
     && (d.Values == "Sum of EuroValue")) 
     .ToList() 
     .GroupBy(x => x.Category) 
     .Select(g => new { 
      C201408 = g.Sum(x => Convert.ToInt32(x.C201408))}); 

這是使LINQ到實體轉換的有效查詢。之後,它將執行.Sum()的分組和選擇。

+0

工程,但效率很低。不過,並不是說有很好的L2E解決方案。這就是爲什麼數字/日期不應該存儲爲字符串。 –

+0

你是對的,它不是那麼高效。就像你所說的那樣,當數據存儲不正確時,它不會非常有效。而且,根據應用程序的不同,某些優化(如此類)可能並不那麼重要。 –

0

只提取您想要求和的列並使其總和。

var dataSet = entities.BL_FERRERO_MT_CATEGORY 
     .Distinct() 
     .Where(d => (iGeography.FirstOrDefault() == "" || iGeography.Contains(d.Geography)) 
     && (iRetailer.FirstOrDefault() == "" || iRetailer.Contains(d.Retailer)) 
     && (iCountry.FirstOrDefault() == "" || iCountry.Contains(d.Country)) 
     && (iAirport.FirstOrDefault() == "" || iAirport.Contains(d.Airport)) 
     && (iShop.FirstOrDefault() == "" || iShop.Contains(d.StoreName)) 
     && (iCategory.Contains(d.Category)) 
     && (d.Values == "Sum of EuroValue")) 
     .Select(x=>x.C201408) 
     .ToList() 
     .Sum(x=>int.Parse(x));