C# SQL端口到LINQ,具有左外部连接,具有聚合和按位过滤
我有以下疑问:C# SQL端口到LINQ,具有左外部连接,具有聚合和按位过滤,c#,sql,linq,C#,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
;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集的操作在C#with Linq中不是一项简单的任务。从我所调查的情况来看,我会同意的。在这一点上,我的调查显示,连接条件中的逐位比较尤其有问题
主要问题是如何将其转换为在C#端使用Linq的东西?或者,在客户端是否有更有效的方法来处理此问题,而Linq不是其中之一(即,只给他们平面数据)
谢谢LINQtoSQL不会做像那个查询那样定制的事情。这不是对LINQtoSQL或查询的批评:简单地说,这是有限制的 我有两种方法: 1:作为通过
ExecuteQuery
的参数化TSQL查询-即
var result = db.ExecuteQuery<YourType>(@"your query here with {0}, {1} etc",
arg0, arg1, ...);
两者都是有效的,将与LINQ to SQL一起使用;就我个人而言,我更喜欢第一种方法,但UDF方法允许在DB层内进行更大的重用,而代价是部署更复杂(即应用层和DB层同时进行)。这里唯一关心的是,我试图找到一种解决方案,消除数据库往返以验证答案。例如,让我们假设这些是测试问题的验证。测试题存在于测试中。开发人员希望在每个问题之后减少对数据库的调用,而是将特定测试的所有验证加载到ASP.NET服务器端缓存对象中,然后根据该缓存对象进行验证,从而节省数据库调用,从理论上提高性能。确认Marc关于LINQ(而不仅仅是LINQ to SQL)的评论不会做任何定制的事情。因此,马克赢了,尽管这不是对这个不太清楚的问题的正确解释。各种策略证明,Linq本身无法轻松处理与左关节的逐位比较,如果真的这样做,即使我让它工作,性能也会非常糟糕。
var result = db.YourUdf(arg0, ...);