如何将child - parent sql查询转换为linq或lambda表达式

时间:2017-11-21 22:12:11

标签: linq lambda qsqlquery

我有tsql查询。它工作正常。我想将其转换为linq查询或lambda表达式

DECLARE @myHID BIGINT;
SET @myHID = 1;

WITH tblChild AS
(
    SELECT *
        FROM wbs.WBS w WHERE w.ParentId = @myHID
    UNION ALL
    SELECT w2.* FROM wbs.WBS w2  JOIN tblChild  ON w2.ParentId = 
    tblChild.hID
    )
    SELECT 
        tblChild.hID, Unit.ID, w3.wbsName + ' * ' + tblChild.wbsName, 
        tblChild.FK_WbsBaseStructure_hID, tblChild.parentID, unitNumber, 
        unitTitle, FK_UsageItem_ID, usageTitle, nominalArea
   FROM tblChild
  inner join unit.Unit on tblChild.hID = Unit.FK_WBS_hID
  inner join unit.UsageItem on Unit.FK_UsageItem_ID = UsageItem.ID
  left join wbs.WBS w3 on tblChild.parentID = w3.hID

感谢的

1 个答案:

答案 0 :(得分:0)

我没有注意到你在SQL中使用了递归CTE。不幸的是,没有良好的直接翻译递归CTE。建议的方法是根据递归SQL和访问权限创建存储过程或视图。

将SQL转换为LINQ,

  1. 将子选项转换为单独的变量
  2. 以LINQ子句顺序翻译每个子句,将monadic运算符(DISTINCTTOP等)作为应用于整个LINQ查询的函数。
  3. 使用表别名作为范围变量。使用列别名作为匿名类型字段名称。
  4. 对多列使用匿名类型(new { }
  5. 使用连接变量模拟左连接,然后从连接变量执行另一个from,后跟.DefaultIfEmpty()
  6. 用条件运算符和空值测试替换coalesce
  7. Concat使用UNION ALLUnion使用UNION