【问题标题】:How to write this query in Linq2Sql如何在 Linq2Sql 中编写此查询
【发布时间】:2011-02-17 20:33:49
【问题描述】:

我有一个表 company,其中包含 company_id、company_name 和其他详细信息。 我有一个表 subcontracts,它有一个映射到 company.company_id 的 company_id 列。

如何编写一个选择语句来获取所有尚未分配到有效分包合同的有效公司? IE subcontracts.company_id中找不到company_id

******编辑*****

我相信正确的sql是:

select company_id 
from company 
where company.active_status = 1 
and not exists( select * from subcontracts 
                where subcontracts.company = company.company_id 
                AND subcontracts.active_status = 1
              )

【问题讨论】:

  • 我会这样写 SQL: SELECT company_id FROM company c LEFT OUTER JOIN subcontracts sc ON c.company_id = sc.company_id AND c.active_status = 1 AND sc.active_status = 1 其中 sc.company_id 是空

标签: sql linq linq-to-sql select


【解决方案1】:

听起来你正在尝试做一个 WHERE NOT IN,比如可能:

var companiesWithoutSubcontracts = 
        from noSub in Companies
        where !(from withSub in Companies
                select withSub.company_id)
               .Contains(noSub.company_id)
        select noSub;

`

【讨论】:

    【解决方案2】:

    子选择在 LINQ 中几乎相同。

    var noSubs = from company in context.Companies
                 where company.active_status == 1 &&
                     !(from subcontract in context.Subcontracts
                      where subcontract.active_status == 1
                      select subcontract.company_id).Contains(company.company_id)
                 select company;
    

    Linq to SQL 会将其翻译为分包表上的“不存在”。

    【讨论】:

      【解决方案3】:

      这应该可行:

      var noContracts =
          from c in db.Companies
          join sc in db.Subcontracts.Where(sc => sc.active_status == 1) on c.company_id equals sc.company_id into compGroup
          from cg in compGroup.DefaultIfEmpty() 
          where cg.company_id == null
          select c;  
      

      这是一个LEFT OUTER JOIN。所有没有对应 company_id 的分包合同都将被分配一个 NULL 的 company_id 值,然后它会选择该值。

      【讨论】:

      • 谢谢。我可以在选择 active_status == 1 且不在 subcontracts.company_id 中的公司时得到它。但是,我似乎无法让它在只匹配带有 active_status == 1 的分包合同的情况下工作。我应该把 where 放在哪里?
      • @RememberME 编辑做我认为你想要的。这也将返回具有非活动分包合同的公司
      • 你真的不需要加入。 LINQ to SQL 完全能够处理 where 子句中的子选择。
      • @Jacob Proffitt 在最坏的情况下,连接与子查询的性能相同,最好的情况下它比子查询更有效,尤其是在涉及 EXISTS 时。
      • 哦,是的。我不是在判断加入 bad。这不是必需的。
      【解决方案4】:

      我还没有测试过,很可能是 LINQ to SQL 无法转换查询,但理论上这应该可以工作。

      var result = context
         .Subcontracts
         .Select(subcontract => new
            {
               Subcontract = subcontract,
               NotAssignedCompanies = context
                  .Companies
                  .Where(company => !company.Subcontracts.Contains(subcontract))
            });
      

      这将返回所有未分配的所有分包公司。如果您只需要一个特定分包合同的信息,以下查询就足够了。

      var notAssignedCompanies = context
         .Companies
         .Where(company => !company.Subcontracts.Contains(specificSubcontract));
      

      【讨论】:

        【解决方案5】:

        弄清楚如何在标准 SQL 中执行此操作,然后获取 Linqer 的副本 (http://www.sqltolinq.com/)。该产品将几乎所有 SQL 语句转换为 LINQ 查询。它不是免费的,但也不昂贵,并且有 30 天的试用期。我发现它非常有用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多