Entity framework IQueryable实体框架POCO映射

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

我正在使用ASP.NET MVC2和EF4。我需要为我的两个类PersonP和AddressP创建POCO,这两个类对应于它们的EF4“复杂”类(包括导航属性和OnPropertyChanged())。仅映射PersonP本身工作正常,但PersonP包含AddressP(外键)-如何使用IQueryable表达式映射它

以下是我尝试过的:

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();