Преобразование SQL в LINQ в SQL

У меня есть 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 в SQL, но мои навыки LINQ еще не там. Может кто-нибудь, пожалуйста, помогите мне преобразовать это. Это заявления with и union, которые делают это немного более сложным для меня.

любая помощь ценится.

2 ответов


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;}
}

Что это рекурсивный CTE. LINQ to SQL пока не поддерживает рекурсивные CTEs (и, вероятно, никогда не будет). Прости!

в качестве обходного пути вы можете оставить запрос в SQL и поместить его в хранимую процедуру. Затем вы можете вызвать эту хранимую процедуру из LINQ в SQL.