C# 编写此linq查询的更好方法是什么?

C# 编写此linq查询的更好方法是什么?,c#,linq,entity-framework,linq-to-sql,linq-to-entities,C#,Linq,Entity Framework,Linq To Sql,Linq To Entities,SQL: 我的linq表情: 我的问题: linq表达式太长,有两个“select new”表达式,我想知道如何缩短它 linq查询的相应扩展方法是什么?我如何表达来自。。。从……哪里。。。用可拓方法 第一个选项选择“新建”。。到x我不明白为什么你需要,尝试删除它,并写新的组节点 from…from被写成一个lambda表达式,如下所示: Categories.SelectMany(n => Categories, (n, p) => new { Node = n, Parent =

SQL:

我的linq表情:

我的问题:

linq表达式太长,有两个“select new”表达式,我想知道如何缩短它

linq查询的相应扩展方法是什么?我如何表达来自。。。从……哪里。。。用可拓方法

第一个选项选择“新建”。。到x我不明白为什么你需要,尝试删除它,并写新的组节点

from…from被写成一个lambda表达式,如下所示:

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

现在我的第一个问题解决了,我删除了第一个“选择新”,它工作了。但是我仍然不知道如何编写相应的扩展方法。我是否必须使用'u,c=>'表达式来选择我需要的所有属性,然后再次使用'GroupBy'、'OrderBy'和'selectnew'呢?如果是这样的话,我的第一个问题和第二个“新”问题是一样的。@RongieZeng更新了答案,使用了你问题中的表格。
        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();
Categories.SelectMany(n => Categories, (n, p) => new { Node = n, Parent = p });