Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL端口到LINQ,具有左外部连接,具有聚合和按位过滤_C#_Sql_Linq - Fatal编程技术网

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, ...);