2016-12-16 235 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));