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");
這可能嗎?
你當然是正確的。我只是意識到,我遇到的問題不是一個實體集,而是數據庫中的一對一關係。我已經相應地更新了這個問題。 – TheQ 2010-06-03 12:32:39
一對一的屬性訪問器的外觀如何?它是否訪問類型爲EntityRef的字段?如果是這樣,你可以創建另一個屬性IsUserPhotoPopulated(也許在一個部分類),如下所示檢查字段_userPhoto.HasLoadedOrAssignedValue。或者,修改getter的邏輯以執行此檢查本身,但重新生成實體模型時(如果它是自動生成的)它將被覆蓋。 –
luksan
2010-06-03 12:53:57
Member和UserPhoto對象都是通過Visual Studio中的dbml文件從相應表中自動生成的,並且據我所知,在任何地方都沒有EntityRef。我可以在部分類中創建新的屬性,但我不知道這是否有幫助。我也可以修改查詢的邏輯,但是這是一個很大的項目,有很多舊代碼,有些是加入數據,有些則沒有,所以如果存在其他方法,我更喜歡。 –
TheQ
2010-06-03 13:25:32