簡體   English   中英

LINQ-在選定列中的選擇語句

[英]LINQ - select statement in the selected column

我打算將以下查詢轉換為linQ

SELECT TOP 100 S.TxID, 
    ToEmail, 
    [Subject], 
    ProcessedDate,
    [Status] = (CASE WHEN EXISTS (SELECT TxID FROM TxBounceTracking
                            WHERE TxID = S.TxID)
                THEN 'Bounced'
                WHEN EXISTS (SELECT TxID FROM TxOpenTracking
                            WHERE TxID = S.TxID)
                THEN 'Opened'
                ELSE 'Sent' END)
FROM TxSubmissions S
WHERE S.UserID = @UserID 
AND ProcessedDate BETWEEN @StartDate AND @EndDate
ORDER BY ProcessedDate DESC

以下代碼是我轉換的linq。

v = (from a in dc.TxSubmissions
where a.ProcessedDate >= datefrom && a.ProcessedDate <= dateto && a.UserID == userId
let bounce = (from up in dc.TxBounceTrackings where up.TxID == a.TxID select up)
let track = (from up in dc.TxOpenTrackings where up.TxID == a.TxID select up)
select new { a.TxID, a.ToEmail, a.Subject, 
    Status = bounce.Count() > 0 ? "Bounced" : track.Count() > 0 ? "Opened" : "Sent", 
    a.ProcessedDate });

但是此linq太慢了,因為反彈和跟蹤表,我應該如何更改linq查詢以選擇一行以僅匹配上面的SQL查詢>>

SELECT TxID FROM TxOpenTracking WHERE TxID = S.TxID 

在我選擇的列中,因此它可以更快地執行。

請注意,該記錄包含一百萬條記錄,這就是為什么它落后

由於您不關心可讀性,因為最終將通過EF生成查詢,因此可以嘗試將這兩個表聯接在一起。 (看起來TxID是FK還是PK / FK)

有關JOIN vs 子查詢的更多信息,請參見: Join vs.子查詢

基本上,您的SQL看起來像這樣:

SELECT TOP 100 S.TxID, ToEmail, [Subject], ProcessedDate,
                [Status] = (CASE WHEN BT.TxID IS NOT NULL
                                 THEN 'Bounced'
                                 WHEN OP.TxID IS NOT NULL
                                 THEN 'Opened'
                                 ELSE 'Sent' END)
            FROM TxSubmissions S
                 LEFT JOIN TxBounceTracking BT ON S.TxID = BT.TxID
                 LEFT JOIN TxOpenTracking OP ON S.TxID = OP.TxID
                WHERE S.UserID = @UserID 
                AND ProcessedDate BETWEEN @StartDate AND @EndDate
            ORDER BY ProcessedDate DESC

然后,您可以嘗試將其轉換為LINQ,例如:

v = (from subs in dc.TxSubmissions.Where(sub => sub.ProcessedDate >= datefrom && sub.ProcessedDate <= dateto && sub.UserID == userId)
from bts in dc.TxBounceTrackings.Where(bt => bt.TxID == subs.TxID).DefaultIfEmpty()
from ots in dc.TxOpenTrackings.Where(ot => ot.TxID == subs.TxID).DefaultIfEmpty()
select new {   });

有關LINQ中的左聯接的更多信息,請參見: LINQ中的LEFT JOIN實體?

另外,如果刪除默認值(如果為空),則將獲得內部聯接。

同樣,在這兩種情況下,您都需要查看生成的SQL。

暫無
暫無

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

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