2010-12-27 12 views
6

tengo la consulta SQLConvert SQL para 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 

y quiero convertirlo en LINQ a SQL, pero mis conocimientos de LINQ no están allí todavía. ¿Podría alguien ayudarme a convertir esto? Son las declaraciones del sindicato y del sindicato las que hacen que esto sea un poco más complejo para mí.

Cualquier ayuda apreciada.

+0

@Randy - que * parece * (en breve inspección) a ser una taxonomía recursiva - CTE es razonable (para árboles cortos, al menos) –

+1

@Randy - ¿Por qué dices que un CTE no es ético? ¿Hay una mejor manera? –

Respuesta

4

LINQ-to-SQL solo admite consultas básicas; El CTE y la recursión no están incluidos en esto. Por lo tanto, aquí está mi traducción de alta tecnología para LINQ a 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

Eso es un recursive CTE. LINQ to SQL aún no es compatible con CTE recursivos (y probablemente nunca lo hará). ¡Lo siento!

Como solución alternativa puede dejar la consulta tal como está en SQL y colocarla en un procedimiento almacenado. A continuación, puede llamar a ese procedimiento almacenado de LINQ a SQL.

+0

¡Es cierto! +1:) ....... – sv88erik

+0

Gracias, parece que debería usar: http://msdn.microsoft.com/en-us/library/bb399403.aspx –