2017-06-23 12 views
0

私はこのプロジェクトを進めており、まずEFデータベースに接続するためのデータベースが用意されています。ICollectionsによって接続された複数のテーブルの照会

特定の顧客の住所を取得しようとしています。ここで

は、Customerクラスです:

[DataContract] 
public partial class Customer 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public Customer() 
    { 
     this.Orders = new HashSet<Order>(); 
     this.WishLists = new HashSet<WishList>(); 
     this.Addresses = new HashSet<Address>(); 
     this.Contacts = new HashSet<Contact>(); 
    } 

    [DataMember] 
    public int CustomerID { get; set; } 

    [DataMember] 
    public string UserName { get; set; } 

    [DataMember] 
    public string FirstName { get; set; } 

    [DataMember] 
    public string LastName { get; set; } 

    [DataMember] 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public ICollection<Order> Orders { get; set; } 

    [DataMember] 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public ICollection<WishList> WishLists { get; set; } 

    [DataMember] 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public ICollection<Address> Addresses { get; set; } 

    [DataMember] 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public ICollection<Contact> Contacts { get; set; } 
} 

とアドレスクラス:

[DataContract] 
public partial class Address 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public Address() 
    { 
     this.Orders = new HashSet<Order>(); 
     this.Customers = new HashSet<Customer>(); 
     this.Employees = new HashSet<Employee>(); 
    } 

    [DataMember] 
    public int AddressID { get; set; } 

    [DataMember] 
    public int AddressType { get; set; } 

    [DataMember] 
    public string Street { get; set; } 

    [DataMember] 
    public string Suburb { get; set; } 

    [DataMember] 
    public string City { get; set; } 

    [DataMember] 
    public string PostalCode { get; set; } 

    [DataMember] 
    public string Country { get; set; } 

    [DataMember] 
    public AddressType AddressType1 { get; set; } 

    [DataMember] 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public ICollection<Order> Orders { get; set; } 

    [DataMember] 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public ICollection<Customer> Customers { get; set; } 

    [DataMember] 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public ICollection<Employee> Employees { get; set; } 
} 

、データベース内のこれらの二つの表は、EFは、公共ICollectionをお客様{になったCustomerAddressテーブルで接続されています取得する;セット; }およびパブリックICollectionアドレス{get;セット; }。

私の目標は、MVC Webアプリケーションに顧客の住所を表示することです。しかし、私は、アドレスを取得するためにLINQクエリまたは同等のものを書くことを試みるのに多くの問題を抱えています。これまで私が試したのは:

// Return the details for current customer (this function works as expected) 
public Customer CurrentCustomer(string UserName) 
{ 
    Customer data = (from c in db.Customers 
        where c.UserName == UserName 
        select c).SingleOrDefault(); 

    return data; 
} 

// Return the address details for current customer (this function does not work) 
public Address GetAddress(string UserName) 
{ 
    // function to retrieve the CustomerID of the current customer 
    var customerID = CurrentCustomer(UserName).CustomerID; 

    Address data = db.Customers.Find(customerID).Addresses.FirstOrDefault(); 

    return address; 
} 

ありがとうございます。私は外来キーの関係なく2つのテーブルを照会するのに苦労しています。

答えて

1

最初にUsernameで顧客を見つけて、そのアドレスを見つけるために渡す必要はありません。あなたは簡単なクエリでそれを見つけることができます。ちょうどあなたの顧客のアドレスを取得するために

はこれにあなたの方法を変更します。

public List<Address> GetAddresses(string UserName) 
    { 
     var addresses = db.Customers.Where(p=> p.UserName == UserName).SelectMany(a=> a.Addresses).ToList(); 

     return addresses; 
    } 

それは、顧客のユーザ名に基づいてアドレスのリストを返します。

、あなたはただ一人の顧客のアドレスを返すためにメソッドの下に使用することができます:

public Address GetAddress(string UserName) 
{ 
    var address = db.Customers.Where(p=> p.UserName == UserName).Select(a=> a.Addresses.FirstOrDefault()).FirstOrDefault(); 

    return address; 
} 

私はそれが参考に願っています。

+0

ありがとうございましたように、クエリを使用することができます。その後

[DataMember] [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public virtual ICollection<Address> Addresses { get; set; } 

外部キーによって、ナビゲーションプロパティの遅延読み込みを提供するために、EFのためのコレクションで仮想を使用する必要があります。私は月曜日に授業に戻ってきます。 – jonenz

+0

この方法で顧客の住所またはすべての住所が必要ですか? –

+0

私はあなたのためにそれらの両方を書いています。遅延読み込み方法で開発することはできますが、パフォーマンス上の問題があります。あなたのために、両方の方法の学生は合理的です。幸運 –

1

あなたはこの

public Address GetAddress(string UserName) 
{ 
    Address data = db.Customers.Find(c => c.UserName == UserName)?.Addresses?.FirstOrDefault(); 

    return address; 
} 
+0

ご協力ありがとうございます。 – jonenz

関連する問題