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