2015-05-25 10 views
1

enter image description hereВыражение не может содержать лямбда-выражения Linq

У меня есть данные стол и я пытаюсь найти сумму столбцов, где Id начинается с особым value.I попробовал несколько способов, но получаю сообщение об ошибке.

result=Convert.ToInt32(dtNew.Compute("Sum(ResPending)", "Substring(ID,0,1)='G'"));//error shows-- Substring() argument is out of range 

И попробовал этот способ также

dtNew.AsEnumerable().Where(x => x.Field<string>("ID").ToString().StartsWith("G"));//Expression can not contain lambda expression 
+0

Последний * выглядит так, как будто все должно быть в порядке - отправьте короткую, но полную программу, демонстрирующую проблему, включая код для настройки таблицы с фиктивными данными. (Вы не нуждаетесь в вызове 'ToString()', btw. Вызов метода 'Field () уже возвращает строку.) –

+4

Я подозреваю, что вы выполнили последнее в окне просмотра« Visual Studio », нет? – har07

+2

'// Выражение не может содержать лямбда-выражение. Эта ошибка обычно возникает при попытке лямбда в окне _Watch_, вы пытаетесь использовать ее непосредственно в коде? – Grundy

ответ

2

Вы должны использовать

Substring(ID,1,1) 
+0

О, это правильно @ Kaushik, спасибо. – sharad

2
result = Convert.ToInt32(dt.Compute("sum(ResPending)", "ID LIKE 'G*'")); 

// это работает для меня.

dtNew.AsEnumerable().Where(x => x.Field<string>("ID").ToString().StartsWith("G")); 

это также работает.

Ниже тестовый код:

Random ran = new Random(); 
     DataTable dt = new DataTable(); 
     dt.Columns.Add("ID"); 
     dt.Columns.Add("Name"); 
     dt.Columns.Add("ResPending", typeof(Int32)); 
     for (int i = 0; i < 11; i++) 
     { 
      DataRow dr = dt.NewRow(); 
      if (i % 2 == 0) 
      { 
       dr[0] = "G123" + i; 
      } 
      else 
      { 
       dr[0] = i; 
      } 

      dr[1] = "an"; 
      dr[2] = ran.Next(1, 100); 
      dt.Rows.Add(dr); 
     } 

     int result = 0; 
     //// result = Convert.ToInt32(dt.Compute("sum(ResPending)", "ID LIKE 'G*'")); 
     ////result = Convert.ToInt32(dt.Compute("Sum(ResPending)", "Substring(ID,0,1)='G'")); ////this throws error. as index is 1 based 
     var k = dt.AsEnumerable().Where(x => x.Field<string>("ID").ToString().StartsWith("G")); 
+0

Это работает, потому что вы перечисляете данные в коллекцию. Это решение, но может быть трудно использовать ресурсы, если таблица особенно велика. Я бы предложил перечислить только идентификаторы, а затем отфильтровать те, которые вы хотите, а затем сделать второй Where..In, чтобы вернуть записи. Он должен быть намного более мягким на ресурсах, даже если вы делаете дополнительный запрос БД. –

+0

Вы говорите о строке ниже: dt.AsEnumerable(). Где (x => x.Field («ID»). ToString(). StartsWith («G»)) – Dreamweaver

+0

Проблема в том, что AsEnumerable() сразу же выполняет ВЫБЕРИТЕ ТОП 100 ПРОЦЕНТОВ. –

0

Этот пример кода возвращает 3 DataRows:

var coll = dt.AsEnumerable().Where(k => k.Field<string>(0).Contains("G")).Select(p => p).ToList(); 

Является ли это то, что вы хотите?