[英]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.