Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 如何在.NET Core 3.0实体框架中执行组加入?_C#_Entity Framework_Linq_.net Core_.net Core 3.0 - Fatal编程技术网

C# 如何在.NET Core 3.0实体框架中执行组加入?

C# 如何在.NET Core 3.0实体框架中执行组加入?,c#,entity-framework,linq,.net-core,.net-core-3.0,C#,Entity Framework,Linq,.net Core,.net Core 3.0,随着对.NET Core 3.0的更改,我得到了 。。。NavigationExpandingExpressionVisitor'失败。这可能表明 EF Core中存在缺陷或限制。看见 欲知详情 信息。)-->System.InvalidOperationException:处理 LINQ表达式“GroupJoin 这是一个非常简单的查询,因此必须有一种在.NET CORE 3.0中执行该查询的方法: var queryResults1 = await patients

随着对.NET Core 3.0的更改,我得到了

。。。NavigationExpandingExpressionVisitor'失败。这可能表明 EF Core中存在缺陷或限制。看见 欲知详情 信息。)-->System.InvalidOperationException:处理 LINQ表达式“GroupJoin

这是一个非常简单的查询,因此必须有一种在.NET CORE 3.0中执行该查询的方法:

 var queryResults1 = await patients
            .GroupJoin(
                _context.Studies,
                p => p.Id,
                s => s.Patient.Id,
                (p, studies) => new 
                {
                    p.DateOfBirth,
                    p.Id,
                    p.Name,
                    p.Sex,
                   Studies =studies.Select(s1=>s1)
                }
            )
            .AsNoTracking().ToListAsync();
我基本上是在寻找一个Linq查询(或如上所述的方法语法),它将把研究加入到患者身上,并将研究设置为空列表,如果没有针对给定患者的研究,则将研究设置为null

有什么想法吗?这是在.NETCore2.2中实现的。此外,上面的MSFT链接提到,密钥中断更改与客户端评估相关,避免生成的查询读取整个表,然后必须在客户端连接或过滤这些表。但是,通过这个简单的查询,连接应该可以在服务器端轻松完成。

如前所述,您正在尝试一个数据库不支持的查询。EF Core 2使用客户端评估来使代码工作,但EF Core 3拒绝了,因为随着数据集的增加,客户端的便利性以难以调试的性能问题为代价

您可以使用
DefaultIfEmpty
左键加入患者研究,然后使用
ToLookup
手动分组

var query =
    from p in db.Patients
    join s in db.Studies on p.Id equals s.PatientId into studies
    from s in studies.DefaultIfEmpty()
    select new { Patient = p, Study = s };

var grouping = query.ToLookup(e => e.Patient); // Grouping done client side

上面的示例获取完整的患者和研究实体,但您可以选择列。如果您需要从患者处获取的数据太大,无法在每次研究中重复,请在关联查询中仅选择患者ID,在单独的非关联查询中查询其余患者数据。

遇到了完全相同的问题,并为此进行了巨大的斗争。事实证明,.NETCore3.0在方法语法中不支持Join或Groupjoin(但?)。 有趣的是,它确实在查询语法中起作用

试试这个,它是带有一些方法语法的查询语法。 这可以很好地转换为正确的SQL查询,并使用一个漂亮的左外部联接,然后在数据库上进行处理。 我没有你的模型,所以你需要自己检查语法

var queryResults1 = 
    (from p in _context.patients
    from s in _context.Studies.Where(st => st.PatientId == p.Id).DefaultIfEmpty()
    select new
    {
        p.DateOfBirth,
        p.Id,
        p.Name,
        p.Sex,
        Studies = studies.Select(s1 => s1)
    }).ToListAsync();

答案有效!我想在查询转换器中还有一些工作要做。像这样的简单查询应该是可翻译的。假设FK/索引正确,则当数据集增加时,两个表的简单组联接不应存在性能问题。我想很多人都会有这个问题,2表组联接是一个非常标准且经常使用的查询。@she72我同意。问题似乎源于LINQ和SQL使用“group”关键字的方式不同。EF Core应该将LINQ
groupby
转换为左连接,这样做不会比预期的要回拉更多的行。我发布了一个相应的问题。我有一个后续问题,我仍然试图理解为什么这种类型的查询需要在客户端进行分组,这似乎是新LINQ框架的一个限制。对于上述情况,我不认为有任何风险会以意外的方式减慢客户端执行。你能澄清一下吗?作为进一步的跟进,主要的问题是:在你重新制定的查询中,哪一组是客户端?如果我每个患者有1000项研究,我将从数据库中加载每个患者1000次?是否有其他方法可以强制在DB中完成这项工作并返回分组结果?@shev72数据库所了解的唯一分组涉及聚合,例如,查询每个患者的研究计数。数据库总是返回一个矩形数据集。分层分组必须由客户端组成。您可以将其视为客户端评估或。在分层分组中,父实体数据会重复,但不会重新查询。顺便说一句,Join和GroupJoin with方法syntac会与非核心框架和EF一起工作。请翻译到正确的查询,即pocessed server sidewhat is studies in studies.选择(s1=>s1)问题中未包含模型,因此我不知道研究模型。我的最佳猜测是,这是模型中的一个虚拟集合。所有查询语法都转换为fluent/lambda/“method”语法,因此如果它转换为查询语法,则等效的fluent查询也将转换。