簡體   English   中英

無法使用 EF 將 SQL 查詢轉換為 LINQ

[英]Unable to translate SQL query to LINQ using EF

我有一個在 SQL 中的查詢如下所示:

SELECT * 
FROM ORDERS o, CUSTOMERS c 
WHERE 
(several conditions)
AND o.NUMBER NOT IN 
    (SELECT o.NUMBER
    FROM ORDERS o, CUSTOMERS c 
    WHERE 
    (exactly the same conditions as above)
    GROUP BY o.NUMBER
    HAVING COUNT(*) > 1)

我在 LINQ 中執行此操作的嘗試返回的結果與 SQL 查詢不同。 這就是我正在做的:

var query = (from o in context.ORDERS
             from c in context.CUSTOMERS
             where (bunch of conditions) &&
                    (from o in context.ORDERS
                     from c in context.CUSTOMERS
                     where (bunch of conditions)
                     group o by o.NUMBER into grp
                     where grp.Count() > 1
                     select grp.Key).Contains(o.NUMBER) == false
             select new { o, c }).ToList();

我想知道的是:

  • 我究竟做錯了什么?
  • 我可以優化查詢嗎? 看起來很糟糕,但我只是沒有想出更好的方法。

你給出的查詢應該完全一樣,所以我懷疑你的條件翻譯不好。 很可能是區分大小寫或可空性錯誤。

您正在執行矩陣連接(或笛卡爾連接),然后使用 where 子句進行過濾。 您應該使用“on”子句將其轉換為適當的連接(您的原始 SQL 也應該這樣做,但它沒有)。 由於您沒有提供 where 條件,我無法幫助您,但無論如何這里是一個半優化版本:

var query = (from o in context.ORDERS
             from c in context.CUSTOMERS
             where (bunch of conditions)
             group new {o,c} by o.NUMBER into grp
             where grp.Count() == 1
             select grp)
             .SelectMany(x=>x)
             .ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM