C# 如何检查是否填充了子对象
如何检查linq对象的子对象是否已填充?下面是示例代码 我的模型有两种方法,一种连接数据,另一种不连接:C# 如何检查是否填充了子对象,c#,linq-to-sql,C#,Linq To Sql,如何检查linq对象的子对象是否已填充?下面是示例代码 我的模型有两种方法,一种连接数据,另一种不连接: public static Member GetMemberWithPhoto(Guid memberId) { using (DataContext db = new DataContext()) { DataLoadOptions dataLoadOptions = new DataLoadOptions(); dataLoadOption
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();
}
}
最后一行将生成“无法访问已处置对象”异常。我知道我可以通过不处理datacontext来消除这个异常,但是最后一行将生成一个新的数据库查询,我不希望这样
我想要的是:
Debug.WriteLine((member1.UserPhoto.IsPopulated()) ? member1.UserPhoto.ToString() : "none");
Debug.WriteLine((member2.UserPhoto.IsPopulated()) ? member2.UserPhoto.ToString() : "none");
是否可能?设置属性是否定义为EntitySet?如果是,那么您应该能够检查HasLoadedOrAssignedValues属性:
Debug.WriteLine(member1.Settings.HasLoadedOrAssignedValues ? member2.Settings.Count : -1);
设置属性是否定义为EntitySet?如果是,那么您应该能够检查HasLoadedOrAssignedValues属性:
Debug.WriteLine(member1.Settings.HasLoadedOrAssignedValues ? member2.Settings.Count : -1);
你当然是对的。然而,我刚刚意识到我遇到问题的代码不是entityset,而是数据库中的一对一关系。我已经相应地更新了这个问题。一对一的属性访问器是什么样子的?它是否访问EntityRef类型的字段?如果是这样,您可以创建另一个属性IsUserPhotoPopulated(可能在部分类上),该属性对字段进行检查,如下所示_userPhoto.hasloadeOrassignedValue。或者,修改getter的逻辑以自行执行此检查,尽管当您重新生成实体模型(如果它是自动生成的)时,它将被覆盖。成员和UserPhoto对象都是通过visual studio中的dbml文件从相应的表中自动生成的,据我所知,在任何地方都没有EntityRef。我可以在部分类中创建新属性,但我不知道这是否有帮助。我也可以修改查询的逻辑,但这是一个包含大量旧代码的大型项目,有些连接数据,有些不连接,因此我更希望存在其他方法。如果在designer.cs中查看UserPhoto的acessor属性,它看起来像什么?它应该访问EntityRef的一个字段,除非您的Linq to SQL生成的代码与我的不同!我在分部类中为名为HasUserPhoto的成员创建了一个新属性,并带有“return this.\u UserPhoto.HasLoadedOrAssignedValue;”。您当然是正确的。然而,我刚刚意识到我遇到问题的代码不是entityset,而是数据库中的一对一关系。我已经相应地更新了这个问题。一对一的属性访问器是什么样子的?它是否访问EntityRef类型的字段?如果是这样,您可以创建另一个属性IsUserPhotoPopulated(可能在部分类上),该属性对字段进行检查,如下所示_userPhoto.hasloadeOrassignedValue。或者,修改getter的逻辑以自行执行此检查,尽管当您重新生成实体模型(如果它是自动生成的)时,它将被覆盖。成员和UserPhoto对象都是通过visual studio中的dbml文件从相应的表中自动生成的,据我所知,在任何地方都没有EntityRef。我可以在部分类中创建新属性,但我不知道这是否有帮助。我也可以修改查询的逻辑,但这是一个包含大量旧代码的大型项目,有些连接数据,有些不连接,因此我更希望存在其他方法。如果在designer.cs中查看UserPhoto的acessor属性,它看起来像什么?它应该访问EntityRef的一个字段,除非您的Linq to SQL生成的代码与我的不同!我在分部类中为名为HasUserPhoto的成员创建了一个新属性,并带有“return this.\u UserPhoto.HasLoadedOrAssignedValue;”。