C# 升级到ef core后,“处理LINQ表达式'GroupByShapeExpression'时出错。5.
我的项目是.NETCore2.2,升级到.NET5和EF5.0 我的最后一个问题是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
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>