"Обработка выражения LINQ "GroupByShaperExpression" Возникла ошибка после обновления до ядра ef. 5

Мой проект был .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, связанное с этим соединением, которое необходимо сначала закрыть.

Я бы предложил переместить Куда ближе к ToListAsync. Это значительно упрощает перевод запросов.

Svyatoslav Danyliv 22.12.2020 08:30

Не могли бы вы поделиться подробным кодом вашей модели? Что такое UsefullLink и UseFullLinkType?

Rena 23.12.2020 06:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
10 321
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

 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

У меня есть класс с «Ключом», также я обновляю свой вопрос

sunny 22.12.2020 13:55

Класс Group<> имеет ключ. Но вышеприведенная коллекция 'g' имеет тип UsefullLinks, который не имеет свойства 'Key'. Следовательно, вопрос в том, нужно ли заменить «g.Key» на «g.Name»??

samiksc 23.12.2020 10:42

Проблема в том, что 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», чтобы оценить его на стороне клиента.

sunny 23.12.2020 07:38

Извините, исправил запрос. Было поздно, моя ошибка.

Svyatoslav Danyliv 23.12.2020 08:09

Измените, как показано ниже:

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, связанный с этим соединением, которое должно быть закрытым в первую очередь.

sunny 23.12.2020 18:43

Это может хорошо работать в моем проекте .net 5. Не могли бы вы поделиться своим _db о том, как вы определили dbcontext?

Rena 24.12.2020 02:40

До обновления он работал нормально, и есть много методов, которые извлекают данные из базы данных. Также я обновляю свой вопрос.

sunny 25.12.2020 09:44

Привет @sunny, попробуй сделать MultipleActiveResultSets=true.

Rena 25.12.2020 09:57

Хорошо, я видел это во многих ответах, но правильно ли это? перед этим какое соединение открыто? Можно ли с помощью этого метода потерять контроль над соединениями?

sunny 25.12.2020 10:16

Это может произойти, если вы выполняете запрос, перебирая результаты другого запроса. Из вашего примера неясно, где это происходит, потому что пример не завершен. Одной из причин этого может быть ленивая загрузка, запускаемая при повторении результатов некоторого запроса. Если мой ответ помог вам, пожалуйста, примите его как ответ.

Rena 25.12.2020 10:27
Ответ принят как подходящий

и спасибо за вашу помощь, после вашей помощи у меня появилось много идей, и у меня было много неизвестных мыслей об этом, с другой стороны, мне нравится 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>

Другие вопросы по теме