2013-05-13 4 views
4

SQL:Каков лучший способ написать этот запрос linq?

SELECT node.CategoryId, 
    node.CategoryName, 
    node.Description, 
    node.Lft, node.Rgt, 
    node.ShowOnMenu, 
(COUNT(parent.CategoryName) - 1) AS Level, 
(CASE WHEN node.Lft = node.Rgt - 1 THEN 'TRUE' ELSE 'FALSE' END) AS Leaf 
FROM Article_Category AS node, 
Article_Category AS parent 
WHERE node.Lft BETWEEN parent.Lft AND parent.Rgt 
GROUP BY node.CategoryId,node.CategoryName,node.Description,node.Lft,node.Rgt,node.ShowOnMenu 
ORDER BY node.Lft 

Мой LINQ выражение:

 var list = (from node in DbContext.Categories 
        from parent in DbContext.Categories 
        where node.Lft >= parent.Lft && node.Lft <= parent.Rgt 
        select new 
        { 
         node.CategoryId, 
         node.CategoryName, 
         node.Description, 
         node.Lft, 
         node.Rgt, 
         node.ShowOnMenu, 
         ParentName = parent.CategoryName, 
        } into x 
        group x by new 
        { 
         x.CategoryId, 
         x.CategoryName, 
         x.Description, 
         x.Lft, 
         x.Rgt, 
         x.ShowOnMenu, 
        } into g 
        orderby g.Key.Lft 
        select new 
        { 
         CategoryId = g.Key.CategoryId, 
         CategoryName = g.Key.CategoryName, 
         Description = g.Key.Description, 
         Lft = g.Key.Lft, 
         Rgt = g.Key.Rgt, 
         ShowOnMenu = g.Key.ShowOnMenu, 
         Level = g.Count() - 1, 
         IsLeaf = g.Key.Lft == g.Key.Rgt - 1 
        }).ToList(); 

Мой вопрос:

  1. Выражение LINQ слишком долго, есть два «выберите новые выражения, мне интересно как сделать его короче?

  2. Каков соответствующий метод расширения для запроса linq? Как я могу выразить «из ... из ... где ...» с помощью метода расширения?

ответ

1

Первый select new .. into x я не понимаю, почему вам нужно, попробуйте удалить его и написать group node by new...

"from...from" записывается в виде лямбда-выражения, как это:

Categories.SelectMany(n => Categories, (n, p) => new { Node = n, Parent = p }); 
+0

Хорошо, я попробуйте, спасибо! – RongieZeng

+0

Теперь мой первый вопрос разрешен, я удаляю первый «select new», он работает. Но я до сих пор не знаю, как написать соответствующий метод расширения. Должен ли я использовать выражение '(u, c) =>', чтобы выбрать все необходимые мне свойства, а затем снова 'GroupBy', 'OrderBy' и 'Select new'? Если это, то то же самое с моим первым вопросом (два «новых»). – RongieZeng

+0

@ RongieZeng Обновленный ответ на использование таблиц из вашего вопроса. – Magnus

Смежные вопросы