2010-12-27 19 views
6

मैं SQL क्वेरीConvert एसक्यूएल 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 करने के लिए इसे एसक्यूएल को परिवर्तित करना चाहते हैं, फिर भी मेरी LINQ कौशल अभी तक नहीं हैं। क्या कोई इसे बदलने में मेरी मदद कर सकता है। यह साथ और यूनियन स्टेटमेंट्स है जो इसे मेरे लिए थोड़ा और जटिल बना रहा है।

किसी भी मदद की सराहना की।

+0

@Randy: इसलिए, यहाँ करने के लिए LINQ करने वाली एसक्यूएल मेरी उच्च तकनीक अनुवाद है (कम पेड़ों के लिए, कम से कम) –

+1

@ रैंडी - आप क्यों कहते हैं कि एक सीटीई अनैतिक है। क्या कोई बेहतर तरीका है? –

उत्तर

4

LINQ-to-SQL केवल मूल प्रश्नों का समर्थन करता है; सीटीई और रिकर्सन इसमें शामिल नहीं हैं। कि * लग रहा है * (संक्षिप्त निरीक्षण पर) एक पुनरावर्ती वर्गीकरण होना करने के लिए - - CTE उचित है

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

यह recursive CTE है। LINQ से SQL अभी तक रिकर्सिव सीटीई का समर्थन नहीं करता है (और शायद कभी नहीं होगा)। माफ़ कीजिये!

एक कामकाज के रूप में आप क्वेरी को छोड़ सकते हैं क्योंकि यह SQL में है और इसे संग्रहीत प्रक्रिया में डाल दिया गया है। फिर आप उस संग्रहित प्रक्रिया को LINQ से SQL तक कॉल कर सकते हैं।

+0

सच है! +1:) ....... – sv88erik

+0

धन्यवाद, ऐसा लगता है कि मुझे इसका उपयोग करना पड़ सकता है: http://msdn.microsoft.com/en-us/library/bb399403.aspx –

संबंधित मुद्दे