首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询由ICollections连接的多个表

查询由ICollections连接的多个表
EN

Stack Overflow用户
提问于 2017-06-23 05:39:17
回答 2查看 71关注 0票数 0

我正在做这个项目,我们得到了一个数据库,首先连接EF数据库。

我正试图检索给定客户的地址。

这是客户级:

代码语言:javascript
复制
[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; }
}

地址类:

代码语言:javascript
复制
[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; }
}

数据库中的这两个表由一个CustomerAddress表连接,该表的EF已转换为公共ICollection客户{ get;set;}和公共ICollection地址{ get;set;}。

我的目标是在我的MVC web应用程序中显示客户的地址。然而,我在试图编写LINQ查询或等效检索地址时遇到了很多困难。到目前为止,我已经尝试过:

代码语言:javascript
复制
// 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;
}

提前谢谢你的帮助。我很难查询两个没有外键关系的表。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-23 05:47:36

您不需要先用Username找到客户,然后再传入以查找其地址。您可以通过一个简单的查询找到它。

要只获取客户地址,请将方法更改为:

代码语言:javascript
复制
    public List<Address> GetAddresses(string UserName)
    {
        var addresses = db.Customers.Where(p=> p.UserName == UserName).SelectMany(a=> a.Addresses).ToList();

        return addresses;
    }

它返回基于客户UserName的地址列表。

您可以使用下面的方法只返回客户的一个地址:

代码语言:javascript
复制
public Address GetAddress(string UserName)
{
    var address = db.Customers.Where(p=> p.UserName == UserName).Select(a=> a.Addresses.FirstOrDefault()).FirstOrDefault();

    return address;
}

希望能帮上忙。

票数 1
EN

Stack Overflow用户

发布于 2017-06-23 05:55:44

必须在EF集合中使用虚拟,以便按外键为导航属性提供延迟加载。

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

之后,您可以像这样使用查询

代码语言:javascript
复制
public Address GetAddress(string UserName)
{
   Address data = db.Customers.Find(c => c.UserName == UserName)?.Addresses?.FirstOrDefault();

   return address;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44713816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档