LINQ to Entities не распознает метод IsUserInCc

Мой код:

elections = elections.Where(e => e.Creator == Username || e.Approver == Username || IsUserInCc(e.Cc,Username))
    .OrderBy(e => e.Status)
    .ThenByDescending(e => e.Group);
var test = elections.FirstOrDefault();

private bool IsUserInCc(string cc, string username)
{
    var ccList = cc.Split(';');
    if (ccList.Contains(username))
        return true;
    return LDAPUtility.Instance.IsUserInGroup(ccList.ToList(), username);
}

Ошибка:

LINQ to Entities не распознает метод IsUserInCc.

Из многих сообщений я могу понять, почему возникла ошибка. Обычно IsUserInCc недоступен при выполнении SQL. Мне нужно как-то преобразовать его обратно в C#, чтобы справиться с этим.

LINQ to Entities не распознает мой метод

LINQ to Entities не распознает метод в запросе

LINQ to Entities не распознает метод System.String ToString (Int32)

Однако в моем конкретном случае какой подход лучше?

Есть ли у вас какие-то исключения или что-то в этом роде ??

AmirReza-Farahlagha 06.08.2018 09:05

Посетите последний ответ, пожалуйста!

AmirReza-Farahlagha 06.08.2018 09:18

какова цель LDAPUtility.Instance.IsUserInGroup (ccList.ToList (), имя пользователя) ;? если это можно удалить или переработать, запрос, вероятно, будет совместим с IQueryable

Mel Gerats 06.08.2018 09:26
Стоит ли изучать 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
3
147
5

Ответы 5

Для вашей функции, написанной в коде, вы не можете использовать это на Queryables. Вам нужно преобразовать в list в памяти, а затем применить требуемый фильтр с помощью вашей функции.

Так что, если elections содержит миллион записей?

Gert Arnold 06.08.2018 10:03

Затем вам нужно преобразовать все, что вы делаете в этой пользовательской функции, в функцию SQL. Нет другого выхода, чтобы справиться с этим

Sarav 06.08.2018 10:05

Но это невозможно из-за string.Split. Я не думаю, что есть какой-либо возможный способ использовать строки «сначала выборка, затем фильтрация». OP должен изменить структуру данных, как предлагается в этом ответе.

Gert Arnold 06.08.2018 10:09

@GertArnold, но это будет изменение дизайна. Но если я не ошибаюсь, здесь задействована строка текстового поля разделителя идентификатора электронной почты (;), которую невозможно нормализовать глубже.

Sarav 06.08.2018 11:23

Конечно, может! Идентификаторы не следует хранить в виде строки, разделенной точкой с запятой.

Gert Arnold 06.08.2018 15:39

@Gert LDAPUtility.Instance.IsUserInGroup выглядит для меня сдерживающим фактором (если это то, что следует из названия). И поскольку он создан в формате Or с критериями Contains, все критерии выглядят непереводимыми в SQL с надлежащей нормализацией данных или без нее. Так что то, что предлагает ответчик, может быть единственным решением в данном конкретном случае.

Ivan Stoev 07.08.2018 18:50

Сначала вам нужно преобразовать в list. Также обратите внимание, что elections должен иметь возможность удерживать list, чтобы это работало.

elections = elections.ToList().Where(e => e.Creator == Username || e.Approver == Username || IsUserInCc(e.Cc,Username))
.OrderBy(e => e.Status)
.ThenByDescending(e => e.Group);

Если вы хотите отправить request на database, используя Linq, например:

var query = listData.Where(x=>x.Id == 123);

Тип этого query - IQueryable, что означает, что ваш запрос еще не Executed!

Теперь вы отправляете данные как IQueryable в метод и не можете обрабатывать свои данные, вам нужно отправить Execute с помощью таких методов, как: Tolist(), ToListAsync() или что-то в этом роде.

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

Удачи.

Можете ли вы попробовать вот так:

 elections = elections.Where(e => e.Creator == Username || e.Approver == Username).Tolist().Where(e => IsUserInCc(e.Cc,Username))
.OrderBy(e => e.Status)
.ThenByDescending(e => e.Group);

var test = choice.FirstOrDefault ();

private bool IsUserInCc(string cc, string username)
{
    var ccList = cc.Split(';');
    if (ccList.Contains(username))
        return true;
    return LDAPUtility.Instance.IsUserInGroup(ccList.ToList(), username);
}

Это другое: он превращает последний || в &&.

Gert Arnold 06.08.2018 10:05

Основная причина вашей проблемы в том, что ваши базовые данные не нормализованы должным образом. Вам нужно поместить свои CC в коллекцию, а не иметь их как одну разделенную строку.

В SQL вам нужно будет добавить новую таблицу с именем CC или что-то в этом роде, поместить туда каждое имя пользователя и связать его с выборами. Или, если это коллекция в памяти, добавьте новое свойство, которое в своем Getter выполнит разделение за вас.

В любом случае, вы не столкнетесь с подобными проблемами. Если ваши данные не структурированы должным образом, вы создадите проблемы для себя дальше по стеку.

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