我有以下查询:
;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缓存中缓存所有规则并处理localy验证。开发人员要求验证数据的非规范化版本,声称基于SQL集的操作不是C#with Linq中的简单任务。根据我的观察,我同意。此时我的调查显示连接条件中的按位比较特别成问题。
主要问题是如何将其转换为在C#端使用Linq的东西?或者,有没有更有效的方法在客户端处理这个问题,Linq不是其中之一(即只是给他们平面数据)?
感谢
答案 0 :(得分:0)
LINQ-to-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方法允许在数据库层中更多地重复使用,代价是更复杂的部署(即同时使用应用层和数据库层)。