2011-03-16 5 views
1

私はは、子エンティティオブジェクト内のオブジェクトリスト

を次のように私はアドレスの詳細をすべてのアドレスの種類のリストを取得するには、上記2つのテーブルを結合し、対応する左い

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

さて、私が書きたいですAdd/Editアドレス画面のドロップダウンボックスに "AddressType"オブジェクトのリストをバインドする必要があるため、一致するAddressオブジェクトとAddressTypeオブジェクトのリストを返すべきである "GetAddressById(int addressId)"という名前のドメインサービスメソッド。

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句は右側のテーブルを参照するため、結合の右側ではnull値を受け取ることはありません。代わりに内部結合を使用します。

2

NEW: データベースでは、AddressesとAddressTypesの関係があり、EntityFrameworkを使用しているとします。

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

コードの行は、今何がない場合にはnullを返します以上が返された場合、それは例外をスローします、のAddressIdのIDを持つ単一のアドレスになるだろう、EFを言うだろう含まれていることもできアドレスを取得したときにAddressTypesをロードし、これを実行するための適切な結合を作成すると、データベースへの単一の問合せが作成され、必要な結果が得られます。

OLD:は のは、私たちは(あなたがEntityFrameworkを使用asuming)AddressTypeにし、DBへのひとつのコールとそのすべてのアドレスがしたいとしましょう、私たちはあなたを

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){}などとしてください。

私はあなたの質問を理解してくれることを願っています。もう一度やり直してください、私は私の答えを編集します。