我有以下查詢:SQL港LINQ與左外連接採用聚集和位過濾
;WITH valRules AS
( SELECT vr.valRuleID, Count(*) AS totalRows, Sum(vt.test) AS validRows
FROM (SELECT NULL AS x) AS x
JOIN #itemMap AS IM
ON IM.lngitemID = 1
JOIN tblValidationRule AS vr
ON IM.RuleID = vr.valRuleID
JOIN tblValidationRuleDetl AS vrd
ON vr.valRuleID = vrd.valRuleID
LEFT JOIN #ValTest AS vt
ON vrd.type = vt.type
AND vrd.typeSequence = vt.typeSequence
AND vrd.valRule & vt.Response > 0
OR (vrd.valrule = 0 AND vt.response = 0)
GROUP BY vr.valRuleID
)
SELECT Count(*)
FROM valrules
WHERE totalrows = validRows
注意的CTE,和位運算符的左連接條件。當前如何使用它是在一個存儲過程中,它以XML變量的形式從C#應用程序中獲取值。 XML變量放置在#valTest表中。所有列都是數據類型INT。如果vt.Response對vaRule有效,則&的結果將大於零。 (即31 & 8 = 8但是12 & 2 = 0)。 vt.Test列包含每行的數字1,因此可以將其合計(自動排除空值)以獲取按規則傳遞的驗證的計數。每個規則都有一些必須通過驗證才能成功的屬性。如果屬性的數量等於那些通過的屬性,我們就會成功。
爲了減少對數據庫的調用,目標是緩存ASP.NET緩存中的所有規則並處理本地驗證。開發人員正在尋求一個非規範化的驗證數據版本,聲稱基於SQL Set的操作在C#中並不是一個簡單的任務,而且是Linq。從我看過的內容來看,我會同意的。在這一點上我的調查顯示,連接條件中的按位比較特別成問題。
主要問題是如何將它轉換爲在C#端使用Linq的東西?或者,在客戶端是否有更有效的方法來處理這個問題,而Linq不是其中之一(即只給他們平面數據)?
感謝
這裏唯一值得關注的是我試圖找到一個解決方案來消除數據庫的往返行爲來驗證答案。例如,讓我們假裝這些是針對測試問題的驗證。測試問題存在於測試中。開發人員希望在每個問題後削減對數據庫的調用,而是將特定測試的所有驗證加載到ASP.NET服務器端緩存對象中,然後對其進行驗證,從而在理論上保存數據庫調用並提高性能。 – MikeH 2010-11-10 21:43:16
確認Marc的評論,即LINQ(而不僅僅是LINQ to SQL)不會像預定的那樣做任何事情。因此,馬克的勝利雖然不是對明確問題的恰當解釋。各種各樣的策略證明Linq本身並不容易處理與左關節的按位比較,如果有的話,即使我將它起作用,性能也會很糟糕。 – MikeH 2010-11-16 20:14:19