2010-11-10 73 views
0

我有以下查詢: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不是其中之一(即只給他們平面數據)?

感謝

回答

0

LINQ到SQL是不會做任何事情相當的定製爲查詢。這不是對LINQ-to-SQL或查詢的批評:簡單地說,有限制。

有兩種方法我將接近的是:

1:經由ExecuteQuery<T>參數化TSQL查詢 - 即

var result = db.ExecuteQuery<YourType>(@"your query here with {0}, {1} etc", 
       arg0, arg1, ...); 

2:寫TSQL映射到數據上下文一個UDF:

var result = db.YourUdf(arg0, ...); 

這兩個都是有效的,並將與LINQ-to-SQL一起工作;我個人更喜歡的第一個方法,但是UDF方法允許在數據庫層中更多地重用,代價是具有更復雜的部署(即同時應用層和數據庫層)。

+0

這裏唯一值得關注的是我試圖找到一個解決方案來消除數據庫的往返行爲來驗證答案。例如,讓我們假裝這些是針對測試問題的驗證。測試問題存在於測試中。開發人員希望在每個問題後削減對數據庫的調用,而是將特定測試的所有驗證加載到ASP.NET服務器端緩存對象中,然後對其進行驗證,從而在理論上保存數據庫調用並提高性能。 – MikeH 2010-11-10 21:43:16

+0

確認Marc的評論,即LINQ(而不僅僅是LINQ to SQL)不會像預定的那樣做任何事情。因此,馬克的勝利雖然不是對明確問題的恰當解釋。各種各樣的策略證明Linq本身並不容易處理與左關節的按位比較,如果有的話,即使我將它起作用,性能也會很糟糕。 – MikeH 2010-11-16 20:14:19