2014-10-21 2 views
1

나는 어떤 달에 일어난 모든 방문을 취하여 몇 가지 기본 정보를 표시하는 보고서 작성 중입니다. 나는 모든 사람들이 방문에 참석 한 사람들의 이름과 성을 제외하고 함께 일하고있다. 방문당 방문객 수는 0에서 무한대에 이릅니다.C# asp repeater에 대한 SQL 쿼리.

여기에는 3 가지 SQL 테이블이 있습니다. dbo.CaseNotes, dbo.VisitAttendance 및 dbo.Persons는

그들은 dbo.VisitAttendance [CaseNoteID] dbo.VisitAttendance [CasePersonID] dbo.Persons에 [PersonID]

에 dbo.CaseNotes [CaseNoteID]에서 연결된

dbo.Persons에서 PersonID에서 FirstName 및 LastName을 얻을 수 있습니다.

"thosePresent"에서 오류가 발생합니다. 어떤 도움이라도 대단히 감사하겠습니다. 때문에 접미사 DataContext

private void Services_BindGrid(DateTime begin, DateTime end) 
    { 
     using (var db = new FormsDataContext()) 
     { 

      var caseID = Convert.ToInt32(Request.QueryString["CaseID"]); 

      var _visitAttend = db.VisitAttendances.Where(v => v.CaseID == caseID); 

      var query = db.CaseNotes.Where(c => c.CaseID == caseID && c.VisitDate >= begin && c.VisitDate <= end) 

         .Select(c=>new 
       { 
        VisitDate = c.VisitDate, 
        StartTime = c.StartTime, 
        EndTime = c.EndTime, 
        Duration = c.Duration, 
        TypeOfContact = db.DropDowns.SingleOrDefault(d => d.DropDownID == c.TypeOfContact).DisplayText, 
        LocationOfVisit = db.DropDowns.SingleOrDefault(d => d.DropDownID == c.LocationOfVisit).DisplayText, 
        VisitPunctuality = c.VisitPuncuality, 
        ThosePresent = db.VisitAttendances.SingleOrDefault(v => v.CaseNoteID == c.CaseNoteID).CasePersonID.ToString() 
       }); 


      rptContacts.DataSource = query.ToList(); 
      rptContacts.DataBind(); 
     } 

    } 
+0

* 오류는 "ThosePresent"에서옵니다 * - 무슨 오류입니까? –

답변

0

난 당신이 Linq2Sql를 사용하고 있으리라 믿고있어 :

여기에 내 현재 코드입니다. SingleOrDefault는 레코드가 없으면 null을 반환하고 두 개 이상이 발견되면 예외를 throw하므로 처음 null을 확인하지 않고 CasePersonID에 액세스하는 것을 권장하지 않습니다.

당신은 아마 같은 다루기 힘든 뭔가 할 수 있지만 : 성능이 지금보다 더 악화 될 것

ThosePresent = db.VisitAttendances.SingleOrDefault(v => v.CaseNoteID == c.CaseNoteID) != null 
      ? db.VisitAttendances.SingleOrDefault(v => v.CaseNoteID == c.CaseNoteID).CasePersonID.ToString() 
      : "No One" 

합니다. 현재 db.DropDowns.SingleOrDefaultdb.VisitAttendances.SingleOrDefault 호출은 쿼리에 의해 투영 된 모든 익명 개체에 대해 한 번 실행됩니다.

Sager가 데이터베이스에서 조인을 수행하게하려면 열심히로드하는 것과 외부 키를 통한 네비게이션을 조합하여 사용하는 것이 좋습니다. 바로 컨텍스트 생성 한 후이를 추가하여이 작업을 수행 :

var options = new DataLoadOptions(); 
options.LoadWith<CaseNotes>(x => x.VisitAttendances); 
db.LoadOptions = options; 

을 그리고 다음과 같이 수행 할 수

ThosePresent = c.VisitAttendances 
    .SingleOrDefault(v => v.CaseNoteID == c.CaseNoteID) 

(다시 있지만, 당신은 역 참조하기 전에 널 (null)에 대한 결과를 확인해야합니다) . 그들은에서 항행 외래 키가있는 경우, 드롭 다운 비슷하게

.Select(c => new 
{ 
    ... 
    tmpThosePresent = c.VisitAttendances 
    .SingleOrDefault(v => v.CaseNoteID == c.CaseNoteID) 
    ... 
} 
.ToList() 
.Select(c => new 
{ 
    ... 
    ThosePresent = c.tmpThosePresent != null 
     ? c.tmpThosePresent.CasePersonID.ToString() 
     : "No One" 
    ... 
}); 

: 진짜 용액은 중간 돌기의 최종 투영을 수행 한 후, 중간 돌출부를 사용 (여과 후) 가시화 한 것이다 LoadsWith으로로드 할 수도 있고, constant 데이터 인 경우 DropDownID으로 고정 된 고정 Dictionary 캐시로로드 할 수도 있습니다.