SQL港LINQ与左外连接采用聚集和位过滤
问题描述:
我有以下查询: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不是其中之一(即只给他们平面数据)?
感谢
答
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方法允许在数据库层中更多地重用,代价是具有更复杂的部署(即同时应用层和数据库层)。
这里唯一值得关注的是我试图找到一个解决方案来消除数据库的往返行为来验证答案。例如,让我们假装这些是针对测试问题的验证。测试问题存在于测试中。开发人员希望在每个问题后削减对数据库的调用,而是将特定测试的所有验证加载到ASP.NET服务器端缓存对象中,然后对其进行验证,从而在理论上保存数据库调用并提高性能。 – MikeH 2010-11-10 21:43:16
确认Marc的评论,即LINQ(而不仅仅是LINQ to SQL)不会像预定的那样做任何事情。因此,马克的胜利虽然不是对明确问题的恰当解释。各种各样的策略证明Linq本身并不容易处理与左关节的按位比较,如果有的话,即使我将它起作用,性能也会很糟糕。 – MikeH 2010-11-16 20:14:19