Мой проект был .net core 2.2 и обновлен до .net 5 и EF 5.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();
}
Мои модели
public class UsefullLink
{
public int Id { get; set; }
public string Name { get; set; }
public bool Active { get; set; }
public DateTime CreateDate { get; set; }
public string Image { get; set; }
public int LinkTypeId { get; set; }
public LinkType LinkType { get; set; }
public int Priority { get; set; }
...
public string Description { get; set; }
public int UseFullLinkTypeId { get; set; }
public UseFullLinkType UseFullLinkType { get; set; }
}
public class UseFullLinkType
{
public int Id { get; set; }
[Required, DataType(DataType.Text)]
public string Name { get; set; }
[DataType(DataType.MultilineText)]
public string Description { get; set; }
[Required, DataType(DataType.Date)]
public DateTime InputDate { get; set; }
public int Priority { get; set; }
public ICollection<UsefullLink> UsefullLinks { get; set; }
}
мой взгляд
@using Univer.Business.Model
@model List<Group<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.Values)
{
<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>
</div>
после запуска проекта я получил эту ошибку
InvalidOperationException: обработка выражения LINQ «GroupByShaperExpression: KeySelector: u.Name, ElementSelector:EntityShaperExpression: EntityType: Полезная ссылка Валуебуферэкспрессион: Выражение Проеционбиндингекспрессион: Емпаспроектионмембер Обнуляемый: Ложь
ОБНОВЛЕНИЕ1: а для группы у меня это в Универ.Бизнес.Модель
public class Group<k, T>
{
public k Key;
public IEnumerable<T> Values;
}
Обновление2 это конструктор для моего репозитория открытый класс UsefullLinkRepository : IUsefullLinkRepository { закрытый только для чтения UniverContext _db;
public UsefullLinkRepository(UniverContext db)
{
_db = db;
}
}
и я меняю метод на
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();
После запуска Update2 я получил эту ошибку
InvalidOperationException: уже существует открытое DataReader, связанное с этим соединением, которое необходимо сначала закрыть.
Не могли бы вы поделиться подробным кодом вашей модели? Что такое UsefullLink и UseFullLinkType?





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();
Здесь в коллекции UsefullLinks есть «Ключ» в качестве столбца? Вы можете использовать g.Name вместо g.Key
У меня есть класс с «Ключом», также я обновляю свой вопрос
Класс Group<> имеет ключ. Но вышеприведенная коллекция 'g' имеет тип UsefullLinks, который не имеет свойства 'Key'. Следовательно, вопрос в том, нужно ли заменить «g.Key» на «g.Name»??
Проблема в том, что EF 2.x молча оценивает непереводимый запрос на стороне клиента. Это ошибка, из-за которой EF Core 5 не выдает правильное исключение в этом случае.
Попробуйте переписать запрос
var grouped = from b in _db.UsefullLinks.AsEnumerable()
group b by b.UseFullLinkType.Name into g
select g;
return grouped.Select(g => new Univer.Business.Model.Group<string, UsefullLink>
{
Key = g.Key,
Values = g // this assignment is not translatable
}).ToList();
после этого я получил эту ошибку «Невозможно перевести данный шаблон GroupBy». Вызовите «AsEnumerable» перед «GroupBy», чтобы оценить его на стороне клиента.
Извините, исправил запрос. Было поздно, моя ошибка.
Измените, как показано ниже:
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();
Результат:
Спасибо за ваше время, как я знаю, в Enumerable мы не отправляем запрос в базу данных, и у нас нет открытого соединения, так как этот сценарий, почему я получаю эту ошибку: «здесь уже есть открытый DataReader, связанный с этим соединением, которое должно быть закрытым в первую очередь.
Это может хорошо работать в моем проекте .net 5. Не могли бы вы поделиться своим _db о том, как вы определили dbcontext?
До обновления он работал нормально, и есть много методов, которые извлекают данные из базы данных. Также я обновляю свой вопрос.
Привет @sunny, попробуй сделать MultipleActiveResultSets=true.
Хорошо, я видел это во многих ответах, но правильно ли это? перед этим какое соединение открыто? Можно ли с помощью этого метода потерять контроль над соединениями?
Это может произойти, если вы выполняете запрос, перебирая результаты другого запроса. Из вашего примера неясно, где это происходит, потому что пример не завершен. Одной из причин этого может быть ленивая загрузка, запускаемая при повторении результатов некоторого запроса. Если мой ответ помог вам, пожалуйста, примите его как ответ.
и спасибо за вашу помощь, после вашей помощи у меня появилось много идей, и у меня было много неизвестных мыслей об этом, с другой стороны, мне нравится Linq Lambda, я одно из предложений, я получил это добавить «MultipleActiveResultSets=true», но я думаю, что у меня не было проблема перед обновлением моего проекта, это означает, что эта проблема связана с моим запросом, и в следующий раз, если я захочу отредактировать свой другой запрос, возможно, я отправлю много подключений к базе данных, и это не очень хорошо для производительности, другой думает, что я использую внешний класс из бизнес-уровня моего проекта, это было из .net core 2.2, а в .net core 5.0 я пытаюсь использовать лучший подход, и в результате я удаляю «MultipleActiveResultSets=true» из своей строки подключения и отключаю использование группового класса из другого уровня проекта, окончательный запрос становится в моем репозитории:
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>
Я бы предложил переместить Куда ближе к ToListAsync. Это значительно упрощает перевод запросов.