【问题标题】:Join two tables in EntityFramework在 EntityFramework 中加入两个表
【发布时间】:2016-09-26 20:07:52
【问题描述】:

我有两张桌子:

  • 公司
  • 具有一对多关系的联系人(一个公司中有多个联系人)

联系人表已编辑

public class Contact
{
   public Guid Id { get; set; }

    public DateTime dateCreated { get; set; }

    public DateTime updated { get; set; }

    public Boolean hidden { get; set; }

    //Personal Data

    public string title { get; set; }

    public string jobTitle { get; set; }

    public string firstName { get; set; }

    public string lastName { get; set; }

    public string department { get; set; }

    public string email { get; set; }

    public string logoUrl { get; set; }

    public string personalRemarks { get; set; }

    //Telephone list

    public ICollection<Phone> Phones { get; set; }

    //Addresses

    public ICollection<Address> Addresses { get; set; }

    //Bank Data

    public ICollection<Bankdata> Bankdatas { get; set; }

    //Tags

    public ICollection<Tag> Tags { get; set; }
}

}

公司表已编辑

public class Organization
{
    public Guid Id { get; set; }

    public DateTime dateCreated { get; set; }

    public DateTime dateUpdated { get; set; }

    public Boolean hidden { get; set; }

    //Company Data

    public string organizationName { get; set; }

    public string taxId { get; set; }

    public string trades { get; set; }

    public string organizationType { get; set; }

    public string actionRadius { get; set; }

    public string organizationRemarks { get; set; }

    public string web { get; set; }

    //Contacts

    public ICollection<Contact> Contacts { get; set; }

    //Tags

    public ICollection<Tag> Tags { get; set; }

}

}

我有一种方法可以在我的存储库中选择一家公司的所有联系人

    public Organization GetOrganizationById(Guid Id)
    {
        return _context.Organizations
            .Include(c => c.Contacts)
            .Where(c => c.Id == Id)
            .FirstOrDefault();
    }

但由于我只有公司 ID,因此我需要在两个表之间进行连接以获得名称。比如:

SELECT contacts,*, Organization.name
FROM contacts
INNER JOIN Organization ON Organization.id = Contacts.organization_id
WHERE Organization.id = id;

我尝试了以下方法但没有成功:

    public Organization GetOrganizationById(Guid Id)
    {
        return _context.Organizations
            .Include(o => o.organizationName)
            .Include(c => c.Contacts)
            .Where(c => c.Id == Id)
            .FirstOrDefault();
    }

欢迎任何帮助

【问题讨论】:

  • 你在使用Entity Framework Code-first吗?
  • 是的,我遵循代码优先方法。我创建了这些类,然后使用 EntityFramework 来生成我的数据库。我的联系人表确实有一个“organizationId”列。但是,我在此处粘贴的代码不会带回该列。而且那一点我不知道如何添加带有公司名称的“选择”语句
  • 但您的模型并未反映您的查询。根据您的查询,您应该在 Contact 模型上拥有 OrganizationId 属性。此外,为了能够使用Include,您应该拥有navigation properties,例如public virual ICollection&lt;Contact&gt; Contacts { get; set; }
  • 对不起,为了节省空间,我没有完整地发布它。我现在会更新它但是,Organizationid 列只是在数据库中,而不是在我的模型中
  • Include 方法用于加载相关数据。 相关数据表示导航属性。您不能将其与organizationName 等普通属性一起使用。您问题中GetOrganizationById 方法的第一种形式应该可以正常工作。当您使用 FirstOrDefault 加载数据时,它会加载所有属性,包括 organizationName

标签: mysql linq asp.net-web-api


【解决方案1】:

正确的做法是在Organization 类和Contact 类之间创建一个导航属性。以下代码将让您了解您需要执行的步骤:

public class Contact
{
    ...

    // Foreign key for Organization
    public Guid OrganizationId { get; set; }

    // Related Organization entity
    [ForeignKey("OrganizationId ")]
    public Organization Standard { get; set; }
}

public class Organization
{
    ...

    // List of related Contacts
    public virtual ICollection<Contact> Contacts { get; set; }

}

使用此代码创建迁移后,您将按如下方式实现您的方法:

public Organization GetOrganizationById(Guid Id)
{
    return _context.Organizations
        .Include(c => c.Contacts)
        .Where(c => c.Id == Id)
        .FirstOrDefault();
}

【讨论】:

  • 我实施了您的建议,但我的迁移遇到了这样的错误:索引 'IX_Contacts_OrganizationId 依赖于列 'OrganizationId' ALTER TABLE ALTER COLUMN OrganizationId 失败,因为一个或多个对象访问此列跨度>
  • 我已经成功完成了迁移,现在我在一个数组中拥有了来自组织的数据。现在的新问题是如何利用这些数据在前端播种。但我会管理它。谢谢我接受你的回答,谢谢
  • 我刚刚注意到,现在,我获得了公司的属性,但我只获得了 1 个联系人,而不是属于该组织的所有联系人。知道为什么吗?
  • @RafaelMunoz 你在某处调用 FirstOrDefault 吗?
  • 我做到了,但由于我的声望点数不到 20 点,所以需要更长的时间才能出现
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多