Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.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# 升级到ef core后,“处理LINQ表达式'GroupByShapeExpression'时出错。5._C#_Entity Framework_Linq_Asp.net Core - Fatal编程技术网

C# 升级到ef core后,“处理LINQ表达式'GroupByShapeExpression'时出错。5.

C# 升级到ef core后,“处理LINQ表达式'GroupByShapeExpression'时出错。5.,c#,entity-framework,linq,asp.net-core,C#,Entity Framework,Linq,Asp.net Core,我的项目是.NETCore2.2,升级到.NET5和EF5.0 我的最后一个问题是 public IList<Group<String, UsefullLink>> GetAllGroupActive() { return (from b in _db.UsefullLinks group b by b.UseFullLinkType.Name into g select new Univer.Busine

我的项目是.NETCore2.2,升级到.NET5和EF5.0 我的最后一个问题是

 public IList<Group<String, UsefullLink>> GetAllGroupActive()
 {
     return (from b in _db.UsefullLinks
             group b by b.UseFullLinkType.Name into g
             select new Univer.Business.Model.Group<string, UsefullLink> 
             { 
                 Key = g.Key, 
                 Values = g 
             }).ToList();        
 }
我把它改为

var data = from b in _db.UsefullLinks.AsEnumerable()
                   join c in _db.UseFullLinkTypes on b.UseFullLinkTypeId equals c.Id
                   group b by b.UseFullLinkType.Name into g
                   select g;

        return data.Select(g => new Group<string, UsefullLink>
        {
            Key = g.Key,
            Values = g
        }).ToList();
运行后更新2 我犯了这个错误

InvalidOperationException:已经有一个与此连接关联的打开的DataReader,必须先关闭它


这里,UsefullLinks集合是否将“键”作为列?您可能希望使用g.Name而不是g.Key

这里的问题是EF2.x在客户端默默地计算不可翻译的查询。在这种情况下,EF Core 5没有抛出正确的异常是一个错误

考虑重写您的查询

var GROUBLED=来自b in _db.UsefullLinks.AsEnumerable 按b.UseFullLinkType.Name分组到g 选择g; return grouped.Selectg=>new Univer.Business.Model.Group { 键=g键, Values=g//此赋值不可翻译 }托利斯特先生; 更改如下:

var data = from b in _db.UsefullLinks.AsEnumerable()
                join c in _db.UseFullLinkType.AsEnumerable() on b.UseFullLinkTypeId equals c.Id
                group b by b.UseFullLinkType.Name into g
                select g;

return data.Select(g => new Group<string, UsefullLink>
{
    Key = g.Key,
    Values = g 
}).ToList();
结果:


谢谢你的帮助,在你的帮助下,我有很多想法,我有很多未知的想法,另一方面我喜欢Linq Lambda,我有一个建议,我得到了add MultipleActiveResultSets=true,但我认为在升级我的项目之前我没有问题,这意味着这个问题来自我的查询,下一次如果我想编辑我的另一个查询,可能我发送了很多到数据库的连接,这对性能不好, 另一个想法是,我使用项目业务层的外部类,它来自.net core 2.2,在.net core 5.0中,我尝试使用更好的方法, 结果是,我从连接字符串中删除了MultipleActiveResultSets=true,并从项目的另一层中删除了group类的使用,最后的查询变成了我的存储库中的查询:

  return _db.UsefullLinks
            .Join(_db.UseFullLinkTypes.AsEnumerable(),
                  ul => ul.UseFullLinkTypeId,
                  ult => ult.Id,
                  (ul, ult) => new { ul = ul, ult = ult }).AsEnumerable()
            .GroupBy(
            x=>x.ul.UseFullLinkType.Name,x=>x.ul )
            .Select (g=>g).ToList();
在我看来,我有一点零钱

@model List<IGrouping<string, Univer.Model.UsefullLink>>
@{
 ViewData["Title"] = "ServiceTebbedTable";
}

<div class="container">
<div class="row UsefullLink ">

    <div class="card ">
        <div class="card-header"> <a asp-action="ServiseTable" asp-controller="Home" asp-area="">Service Table</a></div>
        <ul class="row" style="margin-left:25px ;margin-right:25px;">

            @foreach (var group in Model)
            {
                <li class="row col-md-12" id="cut-diamond"> @group.Key</li>
                <li class="m-1"></li>
                foreach (var link in group)
                {

                    <li class="col-md-4 mt-2  justify-content-center">

                        @if (link.Image != "1")
                        {
                            <img src="@Url.Content(link.Image)" class="UsefullLink-icon" />
                        }
                        else
                        {
                            <img src="~/images/Logo200blue.png" class="UsefullLink-icon" />
                        }
                        <a href="@link.LinkUrl" class="justify-content-center" target="_blank"> @link.Name</a>

                    </li>

                   
                }
            }
        </ul>
    </div>
</div>

我建议搬到离TolistSync更近的地方。它大大简化了查询转换。你能分享关于你的模型的详细代码吗?你的UsefullLink和UseFullLinkType是什么?我有一个类有“Key”,我也更新了我的问题组类有“Key”。但是上面的“g”集合属于UsefullLinks类型,它没有“Key”属性。因此,问题是是否需要将“g.Key”替换为“g.Name”??之后,我出现了“无法翻译给定的“GroupBy”模式”的错误。在'GroupBy'之前调用'AsEnumerable'以在客户端对其进行评估。'抱歉,更正了查询。很晚了,我错了。谢谢你们的时间,正如我在Enumerable中所知道的,我们不向数据库发送查询,也没有开放连接,在这个场景中,我得到了这个错误:“这里已经有一个与此连接相关联的开放DataReader,必须先关闭它。”它在我的.net 5项目中可以很好地工作。您能分享一下关于如何定义dbcontext的您的_db吗?它在更新之前工作得很好,并且有许多方法可以从数据库中获取数据,我还更新了我的问题hi@sunny,尝试使MultipleActiveResultSets=true。好的,我在许多答案中都看到了这一点,但这是正确的方法吗?在此之前,哪个连接是打开的?使用此方法是否可能失去对连接的控制?
var data = from b in _db.UsefullLinks.AsEnumerable()
                   join c in _db.UseFullLinkTypes on b.UseFullLinkTypeId equals c.Id
                   group b by b.UseFullLinkType.Name into g
                   select g;

        return data.Select(g => new Group<string, UsefullLink>
        {
            Key = g.Key,
            Values = g
        }).ToList();
 return (from b in _db.UsefullLinks
            group b by b.UseFullLinkType.Name into g
            select new Univer.Business.Model.Group<string, UsefullLink> 
            { Key = g.Key, Values = g }).ToList(); 
var data = from b in _db.UsefullLinks.AsEnumerable()
                join c in _db.UseFullLinkType.AsEnumerable() on b.UseFullLinkTypeId equals c.Id
                group b by b.UseFullLinkType.Name into g
                select g;

return data.Select(g => new Group<string, UsefullLink>
{
    Key = g.Key,
    Values = g 
}).ToList();
  return _db.UsefullLinks
            .Join(_db.UseFullLinkTypes.AsEnumerable(),
                  ul => ul.UseFullLinkTypeId,
                  ult => ult.Id,
                  (ul, ult) => new { ul = ul, ult = ult }).AsEnumerable()
            .GroupBy(
            x=>x.ul.UseFullLinkType.Name,x=>x.ul )
            .Select (g=>g).ToList();
@model List<IGrouping<string, Univer.Model.UsefullLink>>
@{
 ViewData["Title"] = "ServiceTebbedTable";
}

<div class="container">
<div class="row UsefullLink ">

    <div class="card ">
        <div class="card-header"> <a asp-action="ServiseTable" asp-controller="Home" asp-area="">Service Table</a></div>
        <ul class="row" style="margin-left:25px ;margin-right:25px;">

            @foreach (var group in Model)
            {
                <li class="row col-md-12" id="cut-diamond"> @group.Key</li>
                <li class="m-1"></li>
                foreach (var link in group)
                {

                    <li class="col-md-4 mt-2  justify-content-center">

                        @if (link.Image != "1")
                        {
                            <img src="@Url.Content(link.Image)" class="UsefullLink-icon" />
                        }
                        else
                        {
                            <img src="~/images/Logo200blue.png" class="UsefullLink-icon" />
                        }
                        <a href="@link.LinkUrl" class="justify-content-center" target="_blank"> @link.Name</a>

                    </li>

                   
                }
            }
        </ul>
    </div>
</div>