2013-05-18 4 views
0

У меня есть следующий запрос, и я хочу записать это в Linq (используя C#). Как я должен это делать?Перевести SQL-запрос на запрос linq

declare @parentId bigint 
set @parentId = (select ArticlePart from tbl_Article where ArticleID = 70001) 
declare @ids varchar(100) 
set @ids='' 
while @parentId is not null 
begin 
    set @ids = @ids +CAST(@parentId as varchar(50))+',' 
    set @parentId = (select ArticlePart from tbl_Article where ArticleID = @parentId) 
end 
+2

Для лучшей производительности вы должны написать это как [рекурсивный CTE] (Http: // MSDN. microsoft.com/en-us/library/ms186243(v=sql.105).aspx) в SQL. Не linq. – Magnus

+1

Linq не может управлять потоком управления, а также не может выполнять рекурсивные CTE. Я бы посоветовал вам написать рекурсивный CTE, как предлагает Магнус, а затем использовать либо EF, либо L2S или nHibernate, чтобы выполнить сопоставление результатов запроса с объектами. – Aron

+0

проверить Linqer http://www.sqltolinq.com/ –

ответ

1

Не то, что это может быть лучшим решением этой проблемы, но ответ на вопросе:

var ids = string.Join(",", ArticleQueriable(articles, 70001)); 


Queriable<int> ArticleQueriable(Queriable<Article> tbl_Article, int parentID) 
{ 
    while (true) 
    { 
     var parent = tbl_Article.SingleOrDefault(a => a.ArticleID == parentID); 

     if (parent != null) 
     { 
      parentID = parent.ArticlePart.Dump(); 
      yield return parentID; 
     } 
     else 
     { 
      yield break; 
     } 
    } 
} 
Смежные вопросы