2010-12-27 19 views
6

Ho la query SQLConvert SQL per LINQ to 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 

e voglio convertirlo in LINQ to SQL, ma le mie capacità LINQ non sono ancora arrivati. Qualcuno potrebbe aiutarmi a convertirlo. Sono le dichiarazioni with e union che rendono questo un po 'più complesso per me.

Qualsiasi aiuto apprezzato.

+0

@Randy - che * guarda * (a breve ispezione) per essere una tassonomia ricorsiva - CTE è ragionevole (per gli alberi corti, almeno) –

+1

@Randy - Perché dici che un CTE non è affidabile. C'è un modo migliore? –

risposta

4

LINQ-to-SQL supporta solo query di base; CTE e ricorsione non sono inclusi in questo. Quindi, ecco la mia traduzione ad alta tecnologia per 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(); 

con

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

Questo è un recursive CTE. LINQ to SQL non supporta ancora CTE ricorsive (e probabilmente non lo farà mai). Scusate!

Come soluzione temporanea è possibile lasciare la query così come è in SQL e inserirla in una stored procedure. È quindi possibile chiamare quella stored procedure da LINQ a SQL.

+0

Vero! +1:) ....... – sv88erik

+0

Grazie, sembra che potrei dover usare: http://msdn.microsoft.com/en-us/library/bb399403.aspx –