2010-06-03 30 views
1

如何檢查linq對象的子對象是否已填充?下面的示例代碼。如何檢查是否填充了子對象

我的模型有兩種方法,一種加入數據,以及其他沒有:

public static Member GetMemberWithPhoto(Guid memberId) 
{ 
    using (DataContext db = new DataContext()) 
    { 
     DataLoadOptions dataLoadOptions = new DataLoadOptions(); 
     dataLoadOptions.LoadWith<Member>(x => x.UserPhoto); 
     db.LoadOptions = dataLoadOptions; 

     var query = from x in db.Members 
        where x.MemberId == memberId 
        select x; 

     return query.FirstOrDefault(); 
    } 
} 

public static Member GetMember(Guid memberId) 
{ 
    using (DataContext db = new DataContext()) 
    { 
     var query = from x in db.Members 
        where x.MemberId == memberId 
        select x; 

     return query.FirstOrDefault(); 
    } 
} 

然後我的控制有下面的代碼:

Member member1 = Member.GetMemberWithPhoto(memberId); 
Member member2 = Member.GetMember(memberId); 

Debug.WriteLine(member1.UserPhoto.ToString()); 
Debug.WriteLine(member2.UserPhoto.ToString()); 

最後一行將產生一個「無法訪問已處理對象「的例外。我知道我可以通過不配置datacontext來擺脫這個異常,但最後一行會生成一個新的查詢到數據庫,我不希望這樣。

我想什麼是一樣的東西:

Debug.WriteLine((member1.UserPhoto.IsPopulated()) ? member1.UserPhoto.ToString() : "none"); 
Debug.WriteLine((member2.UserPhoto.IsPopulated()) ? member2.UserPhoto.ToString() : "none"); 

這可能嗎?

回答

1

Settings屬性是否定義爲EntitySet?如果是這樣,那麼你應該能夠檢查HasLoadedOrAssignedValues屬性:

Debug.WriteLine(member1.Settings.HasLoadedOrAssignedValues ? member2.Settings.Count : -1); 
+0

你當然是正確的。我只是意識到,我遇到的問題不是一個實體集,而是數據庫中的一對一關係。我已經相應地更新了這個問題。 – TheQ 2010-06-03 12:32:39

+0

一對一的屬性訪問器的外觀如何?它是否訪問類型爲EntityRef 的字段?如果是這樣,你可以創建另一個屬性IsUserPhotoPopulated(也許在一個部分類),如下所示檢查字段_userPhoto.HasLoadedOrAssignedValue。或者,修改getter的邏輯以執行此檢查本身,但重新生成實體模型時(如果它是自動生成的)它將被覆蓋。 – luksan 2010-06-03 12:53:57

+0

Member和UserPhoto對象都是通過Visual Studio中的dbml文件從相應表中自動生成的,並且據我所知,在任何地方都沒有EntityRef 。我可以在部分類中創建新的屬性,但我不知道這是否有幫助。我也可以修改查詢的邏輯,但是這是一個很大的項目,有很多舊代碼,有些是加入數據,有些則沒有,所以如果存在其他方法,我更喜歡。 – TheQ 2010-06-03 13:25:32