2010-10-09 230 views
1

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

我有下面的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和NOT 45是因为它们的所有部分相同的MANUFACTUREORDER_I。因此,在这个系统中,这意味着库存有15个,但其中两个已经被交易掉了。因此,3行,一个为货物进货,另外两个为两个项目缺货(忽略这些行中的数量)

正如我在开始时提到的,上面的SQL给了我输出我后,但我不确定如何在Linq复制这个。

更新 - 杰夫的原始解决方案

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() 
}; 
+1

LINQ to SQL使用对象而不是数据库表。所以一旦你有你的实体设置,你可以开始玩他们。 – 2010-10-09 15:51:01

+0

我在VS2010中创建了Linq to Sql类,并添加了一个到数据库的连接,然后添加了所需的数据库对象。 – sparkymark75 2010-10-09 16:56:06

+0

简化您的问题,编写Linq代码来选择COUNT很容易解释。编写代码来模仿你的业务逻辑是... *你的*工作。 – 2010-10-09 17:52:14

回答

1

在这里你去。不幸的是,我看不到你留下的评论,但我相信这应该是相同的。我更改了名称以与您的查询密切配合。

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() 
      }; 
+0

杰夫上的斑点。非常感谢您花时间提供帮助。 – sparkymark75 2010-10-09 20:17:54