유효 오류가 아닙니다 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 필드가 아닌 비트 일 때 어떻게 가능합니까?
이 마음을 불허한다 :
내가 왜 그냥 나 한테 물어 보지 않는, 노동 조합의 순서가 문제를 해결 스위칭 발견했다. 나는 동일한 시나리오를 가지고 있었고 이것으로 내 문제가 수정되었습니다. –