使用LAMBDA Expression将sql查询中的CHARINDEX转换为LINQ

时间:2014-01-13 18:21:23

标签: sql linq entity-framework linq-to-sql lambda

我有一个SQL查询,我试图使用Lambda表达式转换为Linq。 我能够在TABLE1.XR_ID和TABLE2.ID上进行正常的连接操作,但后来我意识到SQL查询正在加入CHARINDEX。我做了一些研究,但我无法找到任何资源引导我朝正确的方向发展。

SQL:

SELECT  distinct a.XR_ID FROM 
TABLE1 a 
JOIN  TABLE2 b ON CHARINDEX(CONVERT(VARCHAR(20), a.XR_ID), CONVERT(VARCHAR(20), B.ID), 1) = 1
WHERE 
b.TYPE = 'Q'

LINQ:

var innerQuery =  
             context.TABLE1.
             Join(context.TABLE2, 
             table1 => table1.XR_ID, 
             table2=> table2.ID, 
             (table1 , table2) => 
               new 
               { 
                TABLE1 = table1 , 
                TABLE2 = table2
               })
              .Where( y=> y.table2.TYPE == "Q")
              .Distinct()
              .ToList();

上面的查询没有给我与sql查询相同的结果。任何人都可以指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

您可以使用SqlFunctions Class CHARINDEX方法生成CharIndex,但我认为您无法在LINQ中执行something = 1加入条件。

我认为您应该进行交叉连接并将条件移至where子句。这就是为什么我会从以下开始:

var innerQuery = from t1 in context.Table1
                 from t2 in context.Table2
                 where SqlFunctions.CharIndex(
                           SqlFunctions.StringConvert((double)table1.XR_ID),
                           SqlFunctions.StringConvert((double)table2.ID)) == 1
                     && t2.Type == "Q"
                 select new { Table1 = t1, Table2 = t2 }