2010-06-03 152 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

相关问题