SQL端口到LINQ,左外连接,带聚合和按位过滤

时间:2010-11-10 21:31:23

标签: 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 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不是其中之一(即只是给他们平面数据)?

感谢

1 个答案:

答案 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方法允许在数据库层中更多地重复使用,代价是更复杂的部署(即同时使用应用层和数据库层)。