Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq到层次结构的实体查询_C#_.net_Entity Framework_Linq_Linq To Entities - Fatal编程技术网

C# Linq到层次结构的实体查询

C# Linq到层次结构的实体查询,c#,.net,entity-framework,linq,linq-to-entities,C#,.net,Entity Framework,Linq,Linq To Entities,我有这张桌子: CREATE TABLE [md].[Services] ( [id] [nvarchar](36) NOT NULL, [Value] [nvarchar](500) NOT NULL, [Parentid] [nvarchar](36) NULL, [Status] [nvarchar](10) NOT NULL ) 我编写了一个查询以获得数据的平面视图,如下所示: SELECT bottomLevel.id as [Bot],

我有这张桌子:

CREATE TABLE [md].[Services]
(
    [id] [nvarchar](36) NOT NULL,
    [Value] [nvarchar](500) NOT NULL,
    [Parentid] [nvarchar](36) NULL,
    [Status] [nvarchar](10) NOT NULL
)
我编写了一个查询以获得数据的平面视图,如下所示:

SELECT
    bottomLevel.id as [Bot],
    midLevel.id as [Mid], 
    topLevel.id as [Top]
FROM
    md.Services bottomLevel
LEFT OUTER JOIN 
    md.Services midLevel ON bottomLevel.Parentid = midLevel.id
LEFT OUTER JOIN
    md.Services topLevel ON midLevel.Parentid = topLevel.id
但就我个人而言,我似乎无法用EF来理解LINQ版本

我想出了这个,但它返回了更多的行,我还没有弄清楚我遗漏了什么。。。有什么想法吗

var query = (from level3 in _db.Services
             from level2 in _db.Services
                               .Where(x => x.Parentid == level3.id).DefaultIfEmpty()
             from level1 in _db.Services
                               .Where(x => x.Parentid == level2.id).DefaultIfEmpty()
             select new
                    {
                        Bot = level3.id,
                        Mid = level2.id,
                        Top = level1.id,
                    });
我想出来了。 我有一些东西不见了,我是在倒退

var query2 = (
                from level1 in db.ServiceTypes
                join s1 in db.ServiceTypes on level1.ParentGuid equals s1.Guid into q1
                from level2 in q1.DefaultIfEmpty()
                join s2 in db.ServiceTypes on level2.ParentGuid equals s2.Guid into q2
                from level3 in q2.DefaultIfEmpty()
                select new
                {
                    BottomGuid = level1.Guid,
                    MidGuid = level2.Guid,
                    TopGuid = level3.Guid,
                }

            );