私はこのプロジェクトを進めており、まず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つのテーブルを照会するのに苦労しています。
ありがとうございましたように、クエリを使用することができます。その後
外部キーによって、ナビゲーションプロパティの遅延読み込みを提供するために、EFのためのコレクションで仮想を使用する必要があります。私は月曜日に授業に戻ってきます。 – jonenz
この方法で顧客の住所またはすべての住所が必要ですか? –
私はあなたのためにそれらの両方を書いています。遅延読み込み方法で開発することはできますが、パフォーマンス上の問題があります。あなたのために、両方の方法の学生は合理的です。幸運 –