2016-12-16 5 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 to Entities преобразует действительный запрос. После этого он будет выполнять группировку и выбор .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)); 
Смежные вопросы