【问题标题】:How to include parent objects list in child entity object如何在子实体对象中包含父对象列表
【发布时间】:2011-03-16 12:30:09
【问题描述】:

我的数据库中有以下表格

Table1: tblAddressType (Id, Name)

Table2: tblAddressDtls (Id, AddressTypeId, Address1)

我剩下加入上面两个表来获取所有地址类型的列表和相应的地址详细信息如下

SQL Query:    

    select t1.*, t2.*
    from tblAddressType t1
    left outer join tblAddressDtls t2 on t1.Id = t2.AddressTypeId and t2.Id = 1;

对于上面的表格,我创建了POCO实体类如下:

[Table("tblAddressType ")]
public partial class AddressType
{

    [Key]
    [Column(Name="ID")]
    public int ID { get; set; }

    [Required]
    [Column(Name = "Name")]
    public virtual string Name {get; set;}

    [Include]
    [Association("AddressTypeAddress", "ID", "AddressTypeId")]
    public virtual ICollection<Address> Addresses { get; set; }
}


[Table("tblAddress", SchemaName="dbo")]
public class Address
{
    [Column(Name="ID")]
    public int ID { get; set; }

    [Column(Name = "AddressTypeId")]
    public int? AddressTypeId{ get; set; }

    [Column(Name = "Address1")]
    public string Address1{ get; set; }

    [Include]
    [Association("AddressTypeAddress", "AddressTypeId", "ID", IsForeignKey = true)]
    public virtual AddressType AddressType { get; set; }

}

并且,为了获取上面 sql 查询中所示的数据,我在我的服务代码中编写了以下 LINQ 查询,该查询根据需要返回数据:

var qry = (from p in dbContext.AddressTypes
           join pa in (from t in dbContext.Addresses 
                       where t.ID == 1 select t)
                       on p.ID equals pa.AddressTypeId into ppa
           from t in ppa.DefaultIfEmpty()
           select t).AsQueryable();

现在,我想编写一个名为“GetAddressById(int addressId)”的域服务方法,它应该返回匹配的 Address 对象以及 AddressType 对象列表,因为我需要将“AddressType”对象列表绑定到下拉列表添加/编辑地址屏幕中的框。

I wanted to include and fetch list of "AddressType" objects data at the time of 
fetching Address object data itself to avoid round-trip to server 
in my silverlight client app. 

请建议我实现此功能的最佳方法?

【问题讨论】:

  • 我已经更新了我的答案,如果这不是你想要的,请纠正我,如果它确实有帮助,那么接受它的答案。

标签: silverlight linq frameworks join entity


【解决方案1】:

新: 我假设在数据库中,Addresses 与 AddressTypes 有关系,并且您再次使用 EntityFramework。

GetAddressById(int addressId){
   return dbContext.Address.SingleOrDefault(a => a.ID == addressId).Include("AddressTypes");
}

该行代码现在将获得一个 ID 为 addressId 的地址,如果没有,它将返回 null,或者如果返回更多,它将引发异常,Include 将告诉 EF 您还希望 AddressTypes 为当您获得地址时加载并创建一个适当的连接来实现这一点,所有这些都将成为对数据库的单个查询并获得您想要的结果。

旧: 假设我们想要只调用一次数据库的 AddressType 及其所有地址(假设您使用 EntityFramework),我们将调用类似

的方法
GetAddressTypeIncludingAddresses(int id){
    return _context.AddressType.Include("Addressess"); 
 /*if you use ctp5 of ef code first you should even be able to do (at => at.Addresses) in the include */
}

然后当你使用它时,只需执行addressType.Idforeach(var address in addressType.Addresses){} 之类的操作。

我希望我理解了你的问题,如果没有再试一次,我会编辑我的答案。

【讨论】:

    【解决方案2】:

    您可以通过在您的数据库中创建一个返回多个结果集的存储过程来做到这一点。第一个为您提供您想要的孩子和父母,第二个为您提供您的父母名单。然后您可以使用此处描述的解决方法:

    http://blogs.msdn.com/b/swiss_dpe_team/archive/2008/02/04/linq-to-sql-returning-multiple-result-sets.aspx

    这可以让你得到每个部分的结果。

    顺便说一句,您的查询不需要左连接。由于您的 where 子句引用右侧的表,因此您永远不会在联接的右侧获得空值。请改用内连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多