2013-09-02 3 views
1

Я получаю ошибку «Указанный приказ недействителен» в строке foreach при запуске прилагаемого кода. Я проверил повторные проверки всех типов данных в моем .dbml и типах данных SQL Server (2012). Если я удалю оператор linq с firstordefault, исключение не будет выбрано. Любые идеи, мой мозг болит ...Указанное приведение недействительно при использовании firstordefault

 // open DB context 
     ERAQDataContext db = new ERAQDataContext(); 

     // get set of Room type Inspection codes 
     var RCodes = from v in db.InspectionCodes 
        where v.CodeType == 'R' 
        select v;    

     // loop thru inspection codes and build table of all codes, checking a checkbox 
     // for the ones selected for this inspection. 
     foreach (InspectionCode ic in RCodes) 
     { 
      TableRow tr = new TableRow(); 
      TableCell tc = new TableCell(); 
      tc.Style.Add("Width", "25px"); 
      CheckBox cb = new CheckBox(); 
      tc.Controls.Add(cb); 
      tr.Cells.Add(tc); 
      TableCell tc1 = new TableCell(); 
      tc1.Text = ic.CodeDescription; 
      tc1.Style.Add("Width", "150px"); 
      tr.Cells.Add(tc1); 

      // if this code selected on this inspection, check the checkbox and show any comments 
      var RCodeComment = (from s in db.RoomCodesViews 
           where s.InspectionCodeId == ic.InspectionCodeId && 
           s.InspectionId == Convert.ToInt32(fvDetails.DataKey.Value) 
           select s.Comments).FirstOrDefault(); 

      TableCell tc2 = new TableCell(); 
      if (RCodeComment != null) 
      { 
       tc2.Text = Convert.ToString(RCodeComment); 
      } 
      else 
      { 
       tc2.Text = ""; 
      } 
      tr.Cells.Add(tc2); 
      tbl.Rows.Add(tr); 
     } 
+1

Какова ценность fvDetails.DataKey.Value? – Marco

+0

Marco, значение 7 – plissskin

+0

только для подтверждения, это использует linq-to-sql, правильно? Каков тип s.Comments? можете ли вы опубликовать трассировку стека – ermagana

ответ

0

Я верю, что с помощью

Convert.ToInt32(fvDetails.DataKey.Value) 

не допускается в Linq заявление

+0

Я считаю, что вы ошибаетесь ... Я сделал он много раз успешно. – plissskin

+0

hmmm интересно, если вы запрашиваете базу данных, как будет преобразован Convert.ToInt32 –

+0

Вы можете легко проверить это, выполнив 'var detailsKey = fvDetails.DataKey.Value', затем' ... s.InspectionId == detailsKey 'это означает, что он не будет пытаться преобразовать его в уровень БД. – Squid

0

Заявление

from s in db.RoomCodesViews 
where s.InspectionCodeId == ic.InspectionCodeId && 
s.InspectionId == Convert.ToInt32(fvDetails.DataKey.Value) 
select s.Comments).FirstOrDefault(); 

возвращает IQueryable<RCodeComment> , а не RCodeComment.

from s in db.RoomCodesViews 
where s.InspectionCodeId == ic.InspectionCodeId && 
s.InspectionId == Convert.ToInt32(fvDetails.DataKey.Value) 
from c in s.Comments 
select c).FirstOrDefault(); 

возвращает RCodeComment.

+0

Ваше решение возвращает «Операторы последовательности не поддерживаются для типа« System.String ».» когда выполняется оператор linq. Я думаю, что мой исходный оператор возвращает строку, а ваш пытается сделать firstordefault() для строкового значения, может быть? – plissskin

+0

А, я, хотя из-за множественного числа (Комментарии) это была коллекция. Если это строка, мое решение не имеет смысла. Итак, каков тип 's.Comments'? –

+0

Это строка. Исключение возникает в строке foreach выше. Если я прокомментирую внутреннюю инструкцию linq var RCodeComment = (от s в db.RoomCodesViews ... Я больше не получаю никакого исключения, foreach делает именно то, что ему нужно. Внутренний оператор linq влияет на foreach каким-то образом, что я не могу Если я запустил оператор linq var RCodeComment = (из s в db.RoomCodesViews ...вне цикла foreach (используя константы вместо переменных), он работает без задержек – plissskin

Смежные вопросы