2015-06-30 3 views
1

Однако я пытаюсь вернуть список результатов. Всякий раз, когда результатов нет, я получаю сообщение об ошибке, которое я опубликовал выше. Тем не менее, это странно: всякий раз, когда я добавляю переменную q вместо возврата, она просто не возвращает никаких результатов, и это нормально. Я бы предпочел сделать это так, как я сейчас это делаю сейчас, кто-нибудь знает, что не так с запросом? Всякий раз, когда я запускаю его в LINQPad, он работает отлично.Недопустимое значение cast to value 'System.Int32', потому что материализованное значение равно null.

public IQueryable<ClaimNumberReport> GetClaimsByClaimNumber(int ClientID, int ClaimID) { 
       /*var q = */ return (from d in camOnlineDb.Details 
         join a in camOnlineDb.Areas 
          on new { a = d.ClientID, b = d.AreaID ?? 0 } 
         equals new { a = a.ClientID, b = a.AreaID } 
         where d.ClientID == ClientID 

         join r in camOnlineDb.Reasons 
          on new { a = d.ClientID, b = d.ReasonID ?? 0 } 
         equals new { a = r.ClientID, b = r.ReasonID } 

         join sd in camOnlineDb.SuppDepts 
          on new { a = d.ClientID, b = d.CategoryID ?? 0 } 
         equals new { a = sd.ClientID, b = sd.CategoryID } into sdd 
         from sd in sdd.DefaultIfEmpty() 

         join h in camOnlineDb.Headers 
          on new { d.ClientID, d.ClaimID} 
         equals new { h.ClientID, h.ClaimID } 
         where h.ClaimID == ClaimID 

         join su in camOnlineDb.Suppliers 
          on new { h.ClientID, h.SupplierID } 
         equals new {su.ClientID, su.SupplierID } 

         join cp in camOnlineDb.ClaimPacks 
          on new { h.ClientID, h.ClaimID } 
         equals new { cp.ClientID, cp.ClaimID } 

         join rev in camOnlineDb.Reviews 
          on new { h.ClientID, h.ReviewID } 
         equals new { rev.ClientID, rev.ReviewID } 

         join revp in camOnlineDb.ReviewPeriods 
          on new { a = rev.ClientID, b = rev.ReviewPeriodID ?? 0 } 
         equals new { a = revp.ClientID, b = revp.ReviewPeriodID } 

         join st in camOnlineDb.Statuses 
          on new { a = d.ClientID, b = d.StatusID ?? 0 } 
         equals new { a = st.ClientID, b = st.StatusID } 

         join stcm in camOnlineDb.StatusCategoryMappings 
          on new { st.ClientID, st.StatusID } 
         equals new { stcm.ClientID, stcm.StatusID } 

         join stc in camOnlineDb.StatusCategories 
          on new { stcm.StatusCategoryID } 
         equals new { stc.StatusCategoryID } 
         where stc.StatusCategoryTypeID == 1 

         select new ClaimNumberReport { 
          TypeID = d.ClaimTypeID, 
          CPAttached = cp.FileName, 
          ReviewPeriodName = revp.ReviewPeriodName, 
          ClaimID = d.ClaimID, 
          Line = d.ClaimLine, 
          AccountNo = su.AccountNo, 
          SupplierName = su.SupplierName, 
          Amount = d.Amount, 
          Status = st.StatusDesc, 
          DateSent = d.DateSent, 
          DayOS = d.DaysOS, 
          NominalPeriod = d.NominalPeriod, 
          SLInvoiceNo = d.SLInvoiceNo, 
          Area = a.AreaDesc,     
          DebitRef = d.DebitFile, 
          DebitDate = d.JournalDate, 
          DeductDate = d.DeductDate, 
          StatusCategoryID = stc.StatusCategoryID, 
          StatusCategoryDesc = stc.StatusCategoryDesc, 
          APLReason = r.ReasonDesc, 
          ClientID = d.ClientID, 
          DeptNo = sd.DepartmentID, 
          DeptName = sd.DepartmentName, 
          Agreed = d.Agreed 
         }); 
       /*return q;*/ 
      } 
+0

Итак, вы говорите, что существует разница между 'return (from ...);' и 'var q = (from ...); return q; '? – DavidG

+0

Да, всякий раз, когда я просто использую return, я получаю сообщение об ошибке. Если я использую переменную, она просто заявляет, что не возвращает никаких результатов. –

+0

«Всякий раз, когда результатов нет», я сомневаюсь в этом. Для этой конкретной ошибки должно быть не менее одной строки. Конечно, вы не увидите эту строку, потому что запрос сработает. Может ли это быть правдой? – usr

ответ

4

Эта ошибка вызвана ситуацией, когда тип результата запроса имеет столбец/свойство не-обнуляемого типа, но сгенерированных результаты запроса в виде значения NULL.

Это может считаться ошибкой или нет. Трудно понять, что команда L2S должна была сделать по-другому здесь. Я думаю, что они должны были добавить лучшее сообщение об ошибке. Эта ошибка коварна, потому что иногда только поражает в производстве в необычных данных ...

Вашего левое соединение (sd), похоже, не совпадают и один из sd.* свойств, которые вы выбираете, должен быть int. Решите, что, как это:

DeptNo = (int?)sd.DepartmentID, //Cast to nullable 

d.CategoryID ?? 0

Что ты здесь делаешь? Кажется, это способ сделать компиляцию соединения. Лучше использовать:

    join r in camOnlineDb.Reasons 
         on new { a = d.ClientID, b = (int?)d.ReasonID } 
        equals new { a = r.ClientID, b = (int?)r.ReasonID } 

Это отличное соответствие подписей анонимного типа. Сгенерированный SQL теперь должен быть быстрее. Если вы скажете x ?? 0, который преобразует в COALESCE(x, 0), что может помешать использованию индекса и тому подобное.

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

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