C# LINQ:分组方式和任何

C# LINQ:分组方式和任何,c#,sql,linq,telerik-open-access,C#,Sql,Linq,Telerik Open Access,当我将此LINQ查询发送到数据库时 var temp = dbContext.CustomerOrders .Where(myOrder => myOrder.CustomerID == CustomerID && myOrder.CustomerOrderLines.Any(ol => ol.Article != null && ol.Ar

当我将此LINQ查询发送到数据库时

var temp = dbContext.CustomerOrders
                        .Where(myOrder => myOrder.CustomerID == CustomerID
                                && myOrder.CustomerOrderLines.Any(ol => ol.Article != null && ol.Article.ArticleCode.Contains(TheValue)))                            
                        .OrderByDescending(myOrder => myOrder.ID)
                        .GroupBy(myOrder => myOrder.ID
                        , (g) => new CustomerControlOrderInfo()
                        {
                            CustomerOrderID = g.ID,
                            OrderDate = g.OrderDate,
                            NrOffArticles = string.Format("{0:N0}", g.CustomerOrderLines.Sum(ol => ol.Amount).ToString()),
                            AmountBeforeVAT = string.Format("{0:C}", g.CustomerOrderLines.Sum(o => o.TotalPriceExcl * o.Amount)),
                            //AmountAfterVAT = string.Format("{0:C2}", g.CustomerOrderLines.Sum(o => o.TotalPriceIncl * o.Amount).ToString()),
                            InvoiceNr = g.CustomerInvoices.Any() ? g.CustomerInvoices.LastOrDefault().InvoiceNumber : string.Empty,
                            Agent = g.Agent.Name,
                            Credit = g.CreditOrder,
                            Consignment = g.Consignment,
                            Approved = g.Approved,
                            Invoiced = g.CustomerOrderLines.Count(ol => ol.Invoiced == true) > 0 ? true : false,
                            Send = g.CustomerOrderLines.Count(ol => ol.SendDate != null) > 0 ? true : false
                        })
                        .ToList();
它会导致错误“子查询返回的行数超过”。如果CustomerOrderline上的内容多于CustomerOrderline上的内容,则会发生这种情况

当我查看结果SQL时,似乎缺少一个组。 编辑:,添加了SQL

SELECT a.[i_d] AS COL1, a.[i_d] AS COL2, a.[OrderDate] AS COL3
,  (    SELECT 1
    FROM [CustomerOrderLine] f 
    WHERE a.[i_d] = f.[CustomerOrderID])  AS  EXPR4
, c.[Name] AS COL5
,  (CASE WHEN a.[CreditOrder] <> 0 THEN 1 ELSE 0 END)  AS  EXPR6
,  (CASE WHEN a.[Consignment] <> 0 THEN 1 ELSE 0 END)  AS  EXPR7
,  (CASE WHEN a.[Approved] <> 0 THEN 1 ELSE 0 END)  AS  EXPR8
,  (    SELECT 1                  
    FROM [CustomerOrderLine] g 
    WHERE a.[i_d] = g.[CustomerOrderID])  AS  EXPR9
,  (    SELECT 1                  
    FROM [CustomerOrderLine] h 
    WHERE a.[i_d] = h.[CustomerOrderID])  AS  EXPR10 
FROM [CustomerOrder] a 
    LEFT JOIN [Agent] AS b ON (a.[AgentID] = b.[i_d]) 
    LEFT JOIN [Person] AS c ON (b.[i_d] = c.[i_d]) 
WHERE a.[i_d] = 7085                                       
AND a.[CustomerID] = 185 
AND EXISTS 
(   SELECT 1                  
    FROM [CustomerOrderLine] d 
    JOIN [Article] AS e ON (d.[ArticleID] = e.[i_d]) 
WHERE a.[i_d] = d.[CustomerOrderID] 
AND d.[ArticleID] IS NOT NULL 
AND e.[ArticleCode] LIKE '%mgpn%') 
ORDER BY COL1 DESC
这将生成正确的SQL,但未找到所有订单(缺少的是多行订单):

选择[i\u d]作为COL1,[i\u d]作为COL2,[OrderDate]作为COL3
,(选择1
来自[CustomerOrderLine]f
其中a.[i_d]=f.[CustomerOrderID])作为表达式4
,c.[名称]作为COL5
,(如果[CreditOrder]为0,则为1,否则为0结束)作为EXPR6
,(当[寄售]为0时,则为1,否则为0结束)作为EXPR7
,(当[Approved]为0时,则为1,否则为0结束)作为EXPR8
,(选择1
来自[CustomerOrderLine]g
其中a.[i_d]=g.[CustomerOrderID])作为表达式9
,(选择1
来自[CustomerOrderLine]h
其中a.[i_d]=h.[CustomerOrderID])作为EXPR10
来自[客户订单]a
在(a.[AgentID]=b.[i\u d])上以b的身份左键加入[Agent]
在(b.[i\u d]=c.[i\u d])上以c的身份左键加入[Person]
其中a[i_d]=7085
a.[CustomerID]=185
及
(选择(计数(*)为0时的情况,然后选择1,否则为0结束)
来自[CustomerOrderLine]d
其中a.[i\u d]=d.[CustomerOrderID]
而不是(
存在
(选择1234567
从[第]e条
其中d.[ArticleID]=e.[i\u d]
并且d.[ArticleID]不为空
和像“%mgpn%”这样的e.[ArticleCode]
)
)
)按COL1 DESC排序的0订单

杰伦

jdweng把我放在正确的轨道上,调整了LINQ:

var temp = dbContext.CustomerOrders
                        .Where(myOrder => myOrder.CustomerID == CustomerID
                                && myOrder.CustomerOrderLines.All(ol => ol.Article != null && ol.Article.ArticleCode.Contains(TheValue)))                            
                        .OrderByDescending(myOrder => myOrder.ID)
                        .GroupBy(myOrder => myOrder.ID
                        , (g) => new CustomerControlOrderInfo()
                        {
                            CustomerOrderID = g.ID,
                            OrderDate = g.OrderDate,
                            NrOffArticles = string.Format("{0:N0}", g.CustomerOrderLines.Sum(ol => ol.Amount).ToString()),
                            AmountBeforeVAT = string.Format("{0:C}", g.CustomerOrderLines.Sum(o => o.TotalPriceExcl * o.Amount)),
                            //AmountAfterVAT = string.Format("{0:C2}", g.CustomerOrderLines.Sum(o => o.TotalPriceIncl * o.Amount).ToString()),
                            InvoiceNr = g.CustomerInvoices.Any() ? g.CustomerInvoices.LastOrDefault().InvoiceNumber : string.Empty,
                            Agent = g.Agent.Name,
                            Credit = g.CreditOrder,
                            Consignment = g.Consignment,
                            Approved = g.Approved,
                            Invoiced = g.CustomerOrderLines.Count(ol => ol.Invoiced == true) > 0 ? true : false,
                            Send = g.CustomerOrderLines.Count(ol => ol.SendDate != null) > 0 ? true : false
                        })
                        .ToList();
var temp = dbContext.CustomerOrders
                        .Where(myOrder => myOrder.CustomerID == CustomerID
                                && myOrder.CustomerOrderLines.Any(ol => ol.Article != null && ol.Article.ArticleCode.Contains(TheValue)))                            
                        .OrderByDescending(myOrder => myOrder.ID).ToList()
                        .GroupBy(myOrder => myOrder.ID
                        , (g) => new CustomerControlOrderInfo()
                        {
                            CustomerOrderID = g.ID,
                            OrderDate = g.OrderDate,
                            NrOffArticles = string.Format("{0:N0}", g.CustomerOrderLines.Sum(ol => ol.Amount).ToString()),
                            AmountBeforeVAT = string.Format("{0:C}", g.CustomerOrderLines.Sum(o => o.TotalPriceExcl * o.Amount)),
                            //AmountAfterVAT = string.Format("{0:C2}", g.CustomerOrderLines.Sum(o => o.TotalPriceIncl * o.Amount).ToString()),
                            InvoiceNr = g.CustomerInvoices.Any() ? g.CustomerInvoices.LastOrDefault().InvoiceNumber : string.Empty,
                            Agent = g.Agent.Name,
                            Credit = g.CreditOrder,
                            Consignment = g.Consignment,
                            Approved = g.Approved,
                            Invoiced = g.CustomerOrderLines.Count(ol => ol.Invoiced == true) > 0 ? true : false,
                            Send = g.CustomerOrderLines.Count(ol => ol.SendDate != null) > 0 ? true : false
                        })
                        .ToList();
这将产生以下SQL:

SELECT a.[i_d] AS COL1
FROM [CustomerOrder] a 
WHERE a.[CustomerID] = 185
AND EXISTS 
(   SELECT 1                  
FROM [CustomerOrderLine] b 
    JOIN [Article] AS c ON (b.[ArticleID] = c.[i_d]) 
WHERE a.[i_d] = b.[CustomerOrderID] 
AND b.[ArticleID] IS NOT NULL 
AND c.[ArticleCode] LIKE '%mgpn%') 
ORDER BY COL1 DESC
这避免了对分组依据的需要,并生成完整的列表


Jeroen

向我们显示结果SQL,并告诉我们您认为缺少一个组的位置。您缺少一个Select。您需要一个ID和List的二维数组。每个ID只能获得一个订单。因此您需要如下内容:。GroupBy(myOrder=>myOrder.ID)。Select(x=>x.Select(y=>newCustomerControlOrderInfo(){})。ToList()).ToList();
SELECT a.[i_d] AS COL1
FROM [CustomerOrder] a 
WHERE a.[CustomerID] = 185
AND EXISTS 
(   SELECT 1                  
FROM [CustomerOrderLine] b 
    JOIN [Article] AS c ON (b.[ArticleID] = c.[i_d]) 
WHERE a.[i_d] = b.[CustomerOrderID] 
AND b.[ArticleID] IS NOT NULL 
AND c.[ArticleCode] LIKE '%mgpn%') 
ORDER BY COL1 DESC