EF6 Ошибка фильтрации запросов DB2 Select - PullRequest
0 голосов
/ 13 марта 2020

Я использую EF 6.1.3 и EF DB2 6.1.0 для базы данных. Проблема в том, что EF не применяет WHERE к моему запросу. Но если я скопирую запрос из журнала, он будет работать так, как должен.

            int userId = int.Parse(User.Identity.Name);
            //Форматируем данные под таблицу
            var tasksQuery = context.Tasks
            .Where(t => t.AuthorId == 19)//HERE IS MY SIMPLE WHERE
            .Select(t => new
            {
                Id = t.Id,
                Author = t.Author.Client.LastName + " " + t.Author.Client.FirstName + " " + t.Author.Client.MiidleName,
                Title = t.Title,
                Type = t.Type.Id == TskTaskType.Types.Route ? t.Type.Name + "(" + t.Route.Name + ")" : t.Type.Name,
                Comment = t.Chains
                            .Where(chain => chain.ActionId != null && chain.ActionDate == t.Chains.Max(c => c.ActionDate))
                            .Select(chain => chain.Comment).FirstOrDefault(),//Комментарий последнего совершенного действия
                Status = t.Status.Name,
                StartDate = t.StartDate,
                EndDate = t.EndDate,
                AuthorId = t.AuthorId
            });


            var recordsTotal = tasksQuery.Count();

Первый случай (неправильный ответ): enter image description here SQL (копирование sql клиент дает правильное количество = "1"): enter image description here

Второй случай (Правильный, но я удалил опору автора из проекции. Мне это нужно, так что это не мое решение): enter image description here SQL: enter image description here

Третий случай (правильный, но идентификатор пользователя жестко закодирован Так что это тоже не решение): enter image description here SQL такое же, как в первом случае, за исключением того, что у него нет таких параметров, как "@ p__linq__0", его значение равно жестко запрограммирован в запросе sql.

Помогите мне, пожалуйста, похоже на ошибку.

1 Ответ

1 голос
/ 13 марта 2020

Я решил свой вопрос.

Это была ошибка с типами параметров DbCommand: если тип параметра - Десятичный - Где оператор всегда истинен независимо от значения. Протестировано много раз во многих отношениях, параметр Decimal в этом запросе всегда ломает его. Очень странное поведение, в других частях проекта все отлично работает с Decimal ....

Я добавил AuthorId в свою проекцию Select и сделал ее Integer . Чтобы проверить результат, я добавил CommandInterceptor в EntityFramework.

            int userId = int.Parse(User.Identity.Name);

            var tasksQuery = context.Tasks.Select(t => new
            {
                Id = t.Id,
                Author = t.Author.Client.LastName + " " + t.Author.Client.FirstName + " " + t.Author.Client.MiidleName,
                AuthorId = (int)t.AuthorId,//HERE IS TYPE CAST
                Title = t.Title,
                Type = t.Type.Id == TskTaskType.Types.Route ? t.Type.Name + "(" + t.Route.Name + ")" : t.Type.Name,
                Comment = t.Chains
                            .Where(chain => chain.ActionId != null && chain.ActionDate == t.Chains.Max(c => c.ActionDate))
                            .Select(chain => chain.Comment).FirstOrDefault(),
                Status = t.Status.Name,
                StartDate = t.StartDate,
                EndDate = t.EndDate
            }).Where(t => t.AuthorId == userId);//AND FILTERING AFTER CASTING TO INT


            var recordsTotal = tasksQuery.Count();

До изменений (возвращает общее количество - НЕПРАВИЛЬНО): enter image description here После изменения (обратный отфильтрованный счет - ПРАВИЛЬНО): enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...