将SQL转换为LINQ to SQL

6

我有一个SQL查询

with c as (
  select  categoryId,parentId, name,0 as [level]
  from task_Category b 
  where b.parentId is null
    union all
  select b.categoryId,b.parentId,b.name,[level] + 1
  from task_Category b join c on b.parentId = 
    c.categoryId)
select name,[level],categoryId,parentId 
  as item 
from c

我希望将其转换为LINQ to SQL,但我的LINQ技能还不够。请问有人能帮我转换一下吗?其中with和union语句让这个问题变得更加复杂了一些。感谢任何帮助。

@Randy - 从初步检查来看,那似乎是一个递归分类法 - CTE(公共表达式)是合理的(至少对于短树而言)。 - Marc Gravell
1
@Randy - 你为什么说CTE是不必要的?有更好的方法吗? - Adam
2个回答

8

这是一个递归CTE。LINQ to SQL目前不支持递归CTE(也许永远不会支持)。抱歉!

作为一种解决方法,您可以将查询保留在SQL中并将其放入存储过程中。然后,您可以从LINQ to SQL调用该存储过程。


谢谢,看起来我可能需要使用:http://msdn.microsoft.com/en-us/library/bb399403.aspx - Adam

4
LINQ-to-SQL仅支持基本查询,不包括CTE和递归。因此,以下是我对LINQ-to-SQL的高科技翻译:
var data = ctx.ExecuteQuery<MyStub>(@"
with c as (
  select  categoryId,parentId, name,0 as [level]
  from task_Category b 
  where b.parentId is null
    union all
  select b.categoryId,b.parentId,b.name,[level] + 1
  from task_Category b join c on b.parentId = 
    c.categoryId)
select name,[level],categoryId,parentId 
  as item 
from c").ToList();

使用

class MyStub {
    public string name {get;set;}
    public int level {get;set;}
    public int categoryId {get;set;}
    public int parentId {get;set;}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接