Entity framework IQueryable实体框架POCO映射
我正在使用ASP.NET MVC2和EF4。我需要为我的两个类PersonP和AddressP创建POCO,这两个类对应于它们的EF4“复杂”类(包括导航属性和OnPropertyChanged())。仅映射PersonP本身工作正常,但PersonP包含AddressP(外键)-如何使用IQueryable表达式映射它 以下是我尝试过的:Entity framework IQueryable实体框架POCO映射,entity-framework,entity-framework-4,poco,iqueryable,Entity Framework,Entity Framework 4,Poco,Iqueryable,我正在使用ASP.NET MVC2和EF4。我需要为我的两个类PersonP和AddressP创建POCO,这两个类对应于它们的EF4“复杂”类(包括导航属性和OnPropertyChanged())。仅映射PersonP本身工作正常,但PersonP包含AddressP(外键)-如何使用IQueryable表达式映射它 以下是我尝试过的: class AddressP { int Id { get; set; } string Street { get; set; } } class P
class AddressP
{
int Id { get; set; }
string Street { get; set; }
}
class PersonP
{
int Id { get; set; }
string FirstName { get; set; }
AddressP Address { get; set; }
}
IQueryable<PersonP> persons = _repo.QueryAll()
.Include("Address")
.Select(p => new PersonP
{
Id = p.Id,
FirstName = p.FirstName,
//Address = p.Address <-- I'd like to do this, but p.Address is Address, not AddressP
//Address = (p.Address == null) ? null :
//new AddressP <-- does not work; can't use CLR object in LINQ runtime expression
//{
// Id = p.Address.Id,
// Street = p.Address.Street
//}
});
类地址p
{
int Id{get;set;}
string Street{get;set;}
}
班主任
{
int Id{get;set;}
字符串名{get;set;}
AddressP地址{get;set;}
}
合格人员=_repo.QueryAll()
.包括(“地址”)
.选择(p=>newpersonp
{
Id=p.Id,
FirstName=p.FirstName,
//地址
这是正确的,如果您已经禁用了延迟加载,或者您的对象上下文已经被释放,并且不能用于使延迟加载工作。
是的,它将不起作用,因为首先需要执行查询,然后开始映射它,否则映射逻辑将在数据库中运行,因此会出现异常。
类似的操作将起作用:
//首先执行查询:
IQueryable persons=_repo.QueryAll().包括(“地址”).ToList();
//现在我们有了IEnumerable,可以安全地进行映射:
persons.Select(p=>newpersonp
{
Id=p.Id,
FirstName=p.FirstName,
地址=(p.Address==null)?null:新地址p()
{
Id=p.Address.Id,
街道=p.Address.Street
}
}).ToList();
虽然这个解决方案会起到作用,但是如果要有PoCO类,你当然应该考虑利用EF4.0 PoCO支持,并且直接使用ECO来代替PoCO类。
这是正确的,如果您已经禁用了延迟加载,或者您的对象上下文已经被释放,并且不能用于使延迟加载工作。
是的,它将不起作用,因为首先需要执行查询,然后开始映射它,否则映射逻辑将在数据库中运行,因此会出现异常。
类似的操作将起作用:
//首先执行查询:
IQueryable persons=_repo.QueryAll().包括(“地址”).ToList();
//现在我们有了IEnumerable,可以安全地进行映射:
persons.Select(p=>newpersonp
{
Id=p.Id,
FirstName=p.FirstName,
地址=(p.Address==null)?null:新地址p()
{
Id=p.Address.Id,
街道=p.Address.Street
}
}).ToList();
虽然这个解决方案会起到作用,但是如果要有PoCO类,你当然应该考虑利用EF4.0 PoCO支持,并且直接使用ECO来代替PoCO类。
谢谢您的回复,这正是我想要的。不幸的是,我必须将其保持为IQueryable,因为我必须使用第三方方法应用筛选/排序/分组,并且人员/地址存储库可能非常庞大,因此我必须在执行实际查询之前执行此操作。我将研究POCO EF4支持-我会根据您的经验,您推荐NHibernate解决方案而非此?我对NHibernate没有任何经验,但我认为它不会有任何不同。您也可以查看AsQueryable,看看您是否可以使用它,但我仍然认为在这种情况下POCO是一种方式。感谢您的回复,这正是我想要的不幸的是,我必须将其保持为IQueryable,因为我必须使用第三方方法应用筛选/排序/分组,并且人员/地址存储库可能非常庞大——因此我必须在执行实际查询之前这样做。我将研究POCO EF4支持——根据您的经验,您会推荐NHibernate解决方案吗我没有任何使用NHibernate的经验,但我认为这不会有什么不同。你也可以查看AsQueryable,看看你是否可以使用它,但我仍然认为在这种情况下,POCO是一种方式。
// First we execute the query:
IQueryable<PersonP> persons = _repo.QueryAll().Include("Address").ToList();
// Now we have a IEnumerable and we can safely do the mappings:
persons.Select(p => new PersonP
{
Id = p.Id,
FirstName = p.FirstName,
Address = (p.Address == null) ? null : new AddressP()
{
Id = p.Address.Id,
Street = p.Address.Street
}
}).ToList();