将SQL查询转换为LINQ到SQL

将SQL查询转换为LINQ到SQL,sql,linq-to-sql,Sql,Linq To Sql,如何将带有嵌套SELECT语句的SQL查询转换为LINQ语句 我有下面的SQL语句,它输出我需要的结果,但我不确定如何在LINQ中复制它 SELECT X.ITMGEDSC, (SUM(X.[ENDQTY_I]) - SUM(X.[ORDERLINES])) AS AVAIL FROM SELECT T1.[MANUFACTUREORDER_I],T2.[ITMGEDSC],T1.[ENDQTY_I], (SELECT (COUNT(VW.[MANUFACTUREORDER_I]) - 1)

如何将带有嵌套SELECT语句的SQL查询转换为LINQ语句

我有下面的SQL语句,它输出我需要的结果,但我不确定如何在LINQ中复制它

SELECT X.ITMGEDSC, (SUM(X.[ENDQTY_I]) - SUM(X.[ORDERLINES])) AS AVAIL 
FROM SELECT T1.[MANUFACTUREORDER_I],T2.[ITMGEDSC],T1.[ENDQTY_I],
(SELECT (COUNT(VW.[MANUFACTUREORDER_I]) - 1) 
FROM [PLCD].dbo.[vw_WIP_Srl] VW
WHERE VW.[MANUFACTUREORDER_I] = T1.[MANUFACTUREORDER_I]
GROUP BY VW.[MANUFACTUREORDER_I]) AS ORDERLINES 
FROM [PLCD].dbo.[vw_WIP_Srl] T1 
INNER JOIN [PLCD].dbo.IV00101 T2 ON T2.ITEMNMBR = T1.ITEMNMBR 
GROUP BY T1 [MANUFACTUREORDER_I],T2.[ITMGEDSC],T1.[ENDQTY_I]) AS X
GROUP BY X.ITMGEDSC
ITEMNMBR是包含修订号的项目的ID,例如A1008001。最后3个数字表示修订。所以A1008002是相同的项目,只是不同的修订。在我的查询中,我需要将它们视为相同的项目,并仅输出父项目编号(A1008)的数量。此父项编号为IV00101.ITMGEDSC列

上述代码将采用以下数据

MANUFACTUREORDER_I        ITEMNMBR      ENDQTY_I 
MAN00003140               A1048008      15 
MAN00003507               A1048008      1 
MAN00004880               A10048001     15 
MAN00004880               A10048001     15 
MAN00004880               A10048001     15 
并输出以下结果

ITEMNMBR      QTY 
A1048008      16 
A10048001     13*
  • 该值为13而不是45的原因是因为它们都是同一个制造订单_I的一部分。因此,在系统中,这意味着有15个库存,但其中两个已在缺货时进行交易以供使用。因此,有3行,一行用于进货,另两行用于两项缺货(忽略这些行中的数量)
正如我在开始时提到的,上面的SQL提供了我想要的输出,但我不确定如何在Linq中复制它

更新-JEFF的原始解决方案

var query = from item in db.vw_WIP_Srls
group new { item.MANUFACTUREORDER_I, item.ENDQTY_I } by item.ITEMNMBR into items 
select new
{ 
    ItemNumber = items.Key, 
    QtyAvailable = (from item in items 
           //assumes quantities equal per order number 
           group 1 by item into orders 
           select orders.Key.ENDQTY_I - (orders.Count() - 1)) 
          .Sum()
};

给你。不幸的是,我看不到你给我留下的评论,但我相信这应该是同等的。我更改了名称以与您的查询紧密匹配

var query = from a in db.vw_WIP_Srl
            join b in db.IV00101 on a.ITEMNMBR equals b.ITEMNMBR
            group new { a.MANUFACTUREORDER_I, a.ENDQTY_I } by b.ITMGEDSC into g
            select new
            {
                ITMGEDSC = g.Key,
                AVAIL = (from item in g
                         group 1 by item into orders
                         select orders.Key.ENDQTY_I - (orders.Count() - 1))
                        .Sum()
            };

给你。不幸的是,我看不到你给我留下的评论,但我相信这应该是同等的。我更改了名称以与您的查询紧密匹配

var query = from a in db.vw_WIP_Srl
            join b in db.IV00101 on a.ITEMNMBR equals b.ITEMNMBR
            group new { a.MANUFACTUREORDER_I, a.ENDQTY_I } by b.ITMGEDSC into g
            select new
            {
                ITMGEDSC = g.Key,
                AVAIL = (from item in g
                         group 1 by item into orders
                         select orders.Key.ENDQTY_I - (orders.Count() - 1))
                        .Sum()
            };

LINQtoSQL使用对象,而不是数据库表。因此,一旦您设置了实体,您就可以开始使用它们了。我在VS2010中通过创建Linq到Sql类,添加到数据库的连接,然后添加所需的数据库对象来设置它们。简化您的问题,编写Linq代码以选择计数很容易解释。编写代码来模拟您的业务逻辑是。。。你的工作。谢谢你的建议。实际上,我写这些都是为了帮助别人帮助我。我已经编写了SQL来“模拟”业务逻辑,我正在寻找关于如何在Linq中复制此逻辑的建议/指导。我已经完成了基本的Linq查询,但是没有使用多个嵌套的SELECT语句。我认为在这里发帖的目的是获取建议,而不是讲座。你是否删除了你的另一个问题,还是因为停机而丢失了?在你在评论中解释了一些事情之后,我正要尝试更新它。但我再也无法回答这个问题了。我使用的查询逻辑在IMO中要简单得多,一旦我了解了您的模式,就可以很容易地进行调整。LINQ to SQL使用对象,而不是数据库表。因此,一旦您设置了实体,您就可以开始使用它们了。我在VS2010中通过创建Linq到Sql类,添加到数据库的连接,然后添加所需的数据库对象来设置它们。简化您的问题,编写Linq代码以选择计数很容易解释。编写代码来模拟您的业务逻辑是。。。你的工作。谢谢你的建议。实际上,我写这些都是为了帮助别人帮助我。我已经编写了SQL来“模拟”业务逻辑,我正在寻找关于如何在Linq中复制此逻辑的建议/指导。我已经完成了基本的Linq查询,但是没有使用多个嵌套的SELECT语句。我认为在这里发帖的目的是获取建议,而不是讲座。你是否删除了你的另一个问题,还是因为停机而丢失了?在你在评论中解释了一些事情之后,我正要尝试更新它。但我再也无法回答这个问题了。在我看来,我的查询逻辑要简单得多,一旦我了解了您的模式,就可以很容易地进行调整。非常感谢您抽出时间来帮忙。请注意杰夫。非常感谢您抽出时间来帮忙。