如何编写这个 Linq-to-SQL 选择查询

Posted

技术标签:

【中文标题】如何编写这个 Linq-to-SQL 选择查询【英文标题】:How to write this Linq-to-SQL select query 【发布时间】:2010-05-25 18:12:08 【问题描述】:

我有 3 个表:分包合同、公司和联系人。每个表都有一个 active_status 标志,表明该项目仍处于活动状态(尚未被删除)。

每个联系人都有一个 company_id 字段,用于存储联系人所在公司的 ID。 每个分包合同都有一个 company_id 字段,用于存储分包合同的公司。 每个公司都有一个 company_id 字段,其中包含其 guid 和一个 primary_company 字段,b/c 公司可以是子公司。如果是子公司,primary_company 字段包含主要公司的 id。

我有一份分包合同表格。在表单上,​​我有一个联系人下拉列表,这些联系人存储在联系人表中。目前下拉列表列出了所有联系人。我希望下拉列表仅列出属于分包商公司或该公司任何子公司的联系人。

我有以下查询,我在程序的其他地方使用它来传递 company_id 并获取其子公司。

public IQueryable<company> GetSubsidiaryCompanies(Guid id)

   return
      from c in db.companies
      where c.primary_company == id && c.active_status == true
      select c;

这是我当前的联系人选择

public IQueryable<contact> GetContacts()

   return
      from c in db.contacts
      where c.active_status == true
      orderby c.contact_name
      select c;

我需要做的是将 subcontract.company_id 传递给它,然后只返回 contact.company_id == subcontract.company_idcontact.company_id == 子 ID 之一的联系人。

【问题讨论】:

【参考方案1】:
public IQueryable<contact> GetContacts(Guid id)

    return 
    db.companies
        .Where(c=>c.active_status == true) 
        .Where(c=>c.primary_company == id || c.company_id == id)
        .SelectMany(c=>c.contacts);


【讨论】:

【参考方案2】:
public IQueryable<contact> GetActiveCompanies(Guid id)

    return from c in db.companies 
           where c.active_status == true
              && (c.primary_company == id || c.company_id == id)
           select c;


public IQueryable<contact> GetContacts(Guid id)

    return GetActiveCompanies(id)
          .SelectMany(c=>c.contacts);

【讨论】:

以上是关于如何编写这个 Linq-to-SQL 选择查询的主要内容,如果未能解决你的问题,请参考以下文章

我应该在linq-to-sql中选择哪种关系?

如何编写涉及多个选择的 Oracle SQL 查询

Linq-to-SQL 超时

如何在LINQ-To-SQL中排除Contex.InsertOnSubmit()上的用户定义字段?

如何将 LINQ-to-SQL 映射到 BLL 类?

如何改进 Linq-To-Sql 代码