2011-11-02 2 views
3

유효 오류가 아닙니다 I가 .NET 4.0 전년도은 SQL Server 2008 R2 서버에서 SQL로 Linq를 사용하고 다음 코드를Linq에 유니온

public void Patients() 
    { 
     var documents = GetEMRDocumentsByPatientId("231966"); 
     if (documents.Count() > 0) 
     { 
      foreach (var doc in documents) 
      { 
       Console.WriteLine(doc.PatientId); 
      } 
     } 
    } 

    public static IQueryable<EMRDocument> GetEMRDocumentsByPatientId(string inPatientId) 
    { 
     return GetEMRDocuments().Where(d => String.Equals(d.PatientId, inPatientId)); 
    } 

    public static IQueryable<EMRDocument> GetEMRDocuments() 
    { 
     var dataContext = InitializeDataContext(); 
     IQueryable<EMRDocument> retVal = null; 

     retVal = (from e in dataContext.EMREvaluations 
        select new EMRDocument 
        { 
         PatientId = e.PatientId, 
         IsDeleted = e.Deleted, 
        }).Union(
       from e2 in dataContext.EMRPatientDailyNotes 
       select new EMRDocument 
       { 
        PatientId = e2.PatientID, 
        IsDeleted = false, 
       }); 
     return retVal; 
    } 

응용 프로그램 호출의 시작을 환자(); "개체 참조가 개체의 인스턴스로 설정되지 않았습니다." 처음으로 Patients()의 foreach 줄에 "지정한 캐스트가 유효하지 않습니다."오류가 발생합니다. documents.Count()가 올바르게 작동하고 올바른 데이터베이스의 레코드 수. 또한 생성 된 SQL 문을 SSMS로 실행하여 결과를 올바르게 반환 할 수 있습니다. GetEMRDocuments()에서 231966.

의 PatientId에 대한 그 테이블에 레코드가 없기 때문에 내가 주석 경우 dataContext.EMRPatientDailyNotes에서, 선택을 실행하는 쿼리에서

는, 더 레코드를 반환하지 않는 두 선택 모두에서 IsDeleted = e.Deleted 및 IsDeleted = false이면 아래의 전체 코드가 오류없이 실행됩니다. IsDeleted = e.Deleted를 IsDeleted = false로 변경하면 오류없이 코드가 실행됩니다. 나는 전체 연합 (EU)을 제거하고 그냥 ... 다음

retVal = (from e in dataContext.EMREvaluations 
      select new EMRDocument 
      { 
       PatientId = e.PatientId, 
       IsDeleted = e.Deleted, 
      }); 

을 을 실행하면 ... 다음이 코드는 오류없이 실행됩니다. 또한, e.Deleted는 bool이 아닌 데이터베이스의 bool입니까? (null 가능 bool)이며 IsDeleted는 bool입니다. 이 유형의 문제를 본 사람이 있습니까? 이 문제를 해결하기 위해 무엇을해야할지 모르겠습니다. 또한, 이전에 Linq To Entities를이 동일한 쿼리와 함께 사용했지만이 오류를받지 못했습니다. 어떤 도움이라도 대단히 감사하겠습니다.

감사합니다, 댄

편집 : 여기 스택 추적입니다.

[InvalidCastException: Specified cast is not valid.] 
System.Data.SqlClient.SqlBuffer.get_Boolean() +5057281 
System.Data.SqlClient.SqlDataReader.GetBoolean(Int32 i) +38 
Read_EMRDocument(ObjectMaterializer`1) +313 
System.Data.Linq.SqlClient.ObjectReader`2.MoveNext() +32 
ATI.TherapyConnect.Service.Patients() in C:\SVN\Application\branches\dan.cagney\ATI.TherapyConnect\Service.asmx.cs:57 
ATI.TherapyConnect.Content.UserControls.Shared.Patients.MyPatientsList.BindGrid(String inSortExpression, Int32 inCurrentPage) in C:\SVN\Application\branches\dan.cagney\ATI.TherapyConnect\Content\UserControls\Shared\Patients\MyPatientsList.ascx.cs:129 
ATI.TherapyConnect.Content.UserControls.Shared.Patients.MyPatientsList.Page_Load(Object sender, EventArgs e) in C:\SVN\Application\branches\dan.cagney\ATI.TherapyConnect\Content\UserControls\Shared\Patients\MyPatientsList.ascx.cs:68 
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14 
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35 
System.Web.UI.Control.OnLoad(EventArgs e) +91 
System.Web.UI.Control.LoadRecursive() +74 
System.Web.UI.Control.LoadRecursive() +146 
System.Web.UI.Control.LoadRecursive() +146 
System.Web.UI.Control.LoadRecursive() +146 
System.Web.UI.Control.LoadRecursive() +146 
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2207 

그래서, 분명히에 isDeleted의 부울 값으로 캐스팅 문제가있다 : 나는 실제 오류가 숨어있을 듯 다른 코드를했다. dataContext.EMRPatientDailyNotes에서 반환 된 결과가 없기 때문에 null 값을 Union의 IsDeleted에 매핑하려고 할 수 있습니까? IsDeleted = e.Deleted를 IsDeleted = false로 변경하면 오류가 발생하지 않기 때문에 이것이 문제가 될 것이라고 생각하지 않습니다. 그래서, e.Deleted는 bool 값이 아닌 것을 반환하는 것 같습니다. 그러나 e.Deleted가 Linq에서 SQL로 생성 된 코드의 bool로 정의되고 SQL 데이터베이스의 Null 필드가 아닌 비트 일 때 어떻게 가능합니까?

답변

2

필자는 마침내이 작업을 수행 할 수 있었지만, 왜 필자의 변경이 필요한지 알 수 없습니다. 여기가 내 쿼리를 변경할 것입니다 :

retVal = (from e in dataContext.EMREvaluations 
       select new EMRDocument 
       { 
        PatientId = e.PatientId, 
        IsDeleted = e.Deleted == null ? false : e.Deleted, 
       }).Union( 
      from e2 in dataContext.EMRPatientDailyNotes 
      select new EMRDocument 
      { 
       PatientId = e2.PatientID, 
       IsDeleted = false, 
      }); 

나는

그러나
IsDeleted = e.Deleted == null ? false : e.Deleted 

내가 e.Deleted가 나열되어 있기 때문에이 필요한 이유를 전혀 몰라에

IsDeleted = e.Deleted 

수정 데이터베이스에서 bool (null이 아님), eBooke가 어떻게 null 값을 가질 수 있습니까? 지금이 대답으로 표시하고 있지만 누군가이 코드 변경이 필요한 이유 또는이 코드 변경없이 얻을 수있는 방법을 설명 할 수 있다면 답변으로 표시 할 것입니다.

덕분에, 댄

+0

이 마음을 불허한다 :

내가 왜 그냥 나 한테 물어 보지 않는, 노동 조합의 순서가 문제를 해결 스위칭 발견했다. 나는 동일한 시나리오를 가지고 있었고 이것으로 내 문제가 수정되었습니다. –

0

나는 아래의 기능에 비슷한 문제가 있었다. 그것은 dev에서 완벽하게 작동하지만 SQL Server의 동일한 버전에서 "Specified cast is not valid"프로덕션에서 실패합니다.

public IQueryable<Contract> AllContracts() 
    { 
     return DbDw().Contracts; 
    } 

을 그리고 그것은 작동 ... :

public IQueryable<Contract> AllContracts() 
    { 
     IQueryable<Contract> contracts = 
      from c in DbDw().Contracts 
      select c; 
     return contracts; 
    } 

DbDw은() headscracthing 시행 착오를 많이 후 Linq를하려면 SQL DataContext에

, 나는이 그것을 수정 그림을 이동.

0

null 값을 유지해야하므로 허용 된 대답이 나에게 적합하지 않았습니다.

retVal = 
    (
     from e2 in dataContext.EMRPatientDailyNotes 
     select new EMRDocument 
     { 
      PatientId = e2.PatientID, 
      IsDeleted = (bool?)false 
     } 
    ) 
    .Union(
     from e in dataContext.EMREvaluations 
     select new EMRDocument 
     { 
      PatientId = e.PatientId, 
      IsDeleted = e.Deleted 
     } 
    );