2011-02-13 146 views
1

所以我有以下LINQ查詢:高級LINQ查詢幫助

var qryVans = from v in objContext.vans 

       join s in objContext.schools on v.schoolID equals s.schoolID 
       join l in objContext.locations on v.lastKnownLocationID equals l.locationID 

       select new DisplayVan { 
        vanID = v.vanID, 
        vanName = v.vanName, 
        phone = v.phone, 
        capacity = (int)v.capacity, 
        schoolName = s.schoolName, 
        lastLocationName = l.locationName, 
        statusNote = v.statusNote, 
        isOffline = (v.isOffline == 1) ? true : false, 
        isPrayerRoom = (v.isPrayerRoom == 1) ? true : false, 
        isNotReady = (v.isNotReady == 1) ? true : false, 
        creationDate = v.creationDate, 
        modifiedDate = v.modifiedDate, 
        vanAssignments = from a in v.vanAssignments 
            where a.vanID == v.vanID 
            select a 
       }; 

所有工作正常,但我需要填補VanAssignment實體的導航屬性。請注意,在我的DisplayVan投影中,我使用嵌套查詢來收集給定麪包車的麪包分配。 vanAssignment實體有一個人實體。那麼如何在這個查詢中加載vanAssignment.person屬性?

另外,我可以寫這個更有效嗎?

感謝您的幫助!

編輯

這裏就是我上面的代碼失敗:

後,我在查詢執行toList()以上,我會嘗試訪問所需要的人是這樣的:

List<DisplayVan> lstVans = qryVans.toList<DisplayVan>(); 
foreach(DisplayVan objVan in lstVans) { 

    Console.WriteLine(objVan.person.firstName); 

} 

現在,由於我沒有使用vanAssignment實體加載person實體,因此person導航屬性爲null,並且會引發錯誤。

我的問題圍繞正確的方式加載這個人實體以及vanAssignment?

希望有所幫助。

+1

這不是問題的答案,但(v.isOffline == 1)? true:false不是必需的。只需使用(v.isOffline == 1),因爲它是一個布爾值。不需要條件表達式。 – 2011-02-13 16:47:34

+0

我不明白這個問題。你能否顯示你使用的代碼,哪裏出錯? – 2011-02-13 16:49:07

回答

1

由於DisplayVan聽起來像一個DTO,你爲什麼不選擇一個DisplayVanAssignment對象明確引用您需要的人員屬性。

0

你可能有這樣的事情的人分配

... 
modifiedDate = v.modifiedDate, 
vanAssignments = GetVanAssignmentsWithPerson(v.vanAssignments.where(a => a.VanID == v.vanID), person) 
... 

private static IEnumerable<Assignment> GetVanAssignmentsWithPerson(IEnumerable<Assignment> assignments, Person p) 
{ 
     foreach(var assignment in assignments) 
     { 
      assignment.person = p; 
     } 
} 
1

我不是LINQ to SQL的專家,但發現這一點:

DataLoadOptions dataLoadOptions = new DataLoadOptions(); 
dataLoadOptions.LoadWith<Assignment>(a => a.Person); 
objContext.LoadOptions = dataLoadOptions; 

設置DataLoadOptions會使人急於負載分配。

編輯

這項工作在EF肯定的,但也應該在工作的LINQ到SQL:

(from a in v.vanAssignments 
where a.vanID == v.vanID 
select new { Assignment = a, Person = a.Person }).Select(i => i.Assignment);