2011-03-16 120 views
1

我有我的數據庫中下表如何包括父對象子實體對象列表

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」對象列表綁定到Add/Edit地址屏幕中的下拉框。

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. 

請告訴我實現此功能的最佳方法嗎?

+0

我已經更新了我的答案,如果這不是在做你想要的東西,那麼請糾正我,如果確實有幫助,那就接受它的答案。 – Joakim

回答

1

您可以通過在您的數據庫中創建一個存儲過程來完成此操作,該過程返回多個結果集。首先是讓你獲得你想要的孩子和父母的一方,然後是讓你獲得父母名單的那一方。然後你可以使用工作在這裏描述:

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

,讓您得到的結果的每一部分。

另外,您不需要爲您的查詢進行左連接。由於您的where子句引用右側的表,您將永遠不會在連接的右側獲得空值。改爲使用內連接。

2

NEW: 我假設在數據庫中,Addresses與AddressTypes有關係,並且您再次使用EntityFramework。

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

的代碼,該行現在會得到具有addressId的ID一個地址,如果沒有,則它會返回null,或者更多返回它會拋出一個異常,包括會告訴EF,你也當您獲取地址時需要加載AddressTypes並創建適當的聯接以實現此目的,所有這些都會對數據庫進行單個查詢並獲得所需的結果。

OLD: 比方說,我們要的地址類型和它只有一個調用數據庫中的所有地址(asuming您使用的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){}等等。

我希望我能理解你的問題,如果不是再試一次,我會編輯我的答案。

相關問題