Мой код:
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)
Однако в моем конкретном случае какой подход лучше?
Посетите последний ответ, пожалуйста!
какова цель LDAPUtility.Instance.IsUserInGroup (ccList.ToList (), имя пользователя) ;? если это можно удалить или переработать, запрос, вероятно, будет совместим с IQueryable





Для вашей функции, написанной в коде, вы не можете использовать это на Queryables. Вам нужно преобразовать в list в памяти, а затем применить требуемый фильтр с помощью вашей функции.
Так что, если elections содержит миллион записей?
Затем вам нужно преобразовать все, что вы делаете в этой пользовательской функции, в функцию SQL. Нет другого выхода, чтобы справиться с этим
Но это невозможно из-за string.Split. Я не думаю, что есть какой-либо возможный способ использовать строки «сначала выборка, затем фильтрация». OP должен изменить структуру данных, как предлагается в этом ответе.
@GertArnold, но это будет изменение дизайна. Но если я не ошибаюсь, здесь задействована строка текстового поля разделителя идентификатора электронной почты (;), которую невозможно нормализовать глубже.
Конечно, может! Идентификаторы не следует хранить в виде строки, разделенной точкой с запятой.
@Gert LDAPUtility.Instance.IsUserInGroup выглядит для меня сдерживающим фактором (если это то, что следует из названия). И поскольку он создан в формате Or с критериями Contains, все критерии выглядят непереводимыми в SQL с надлежащей нормализацией данных или без нее. Так что то, что предлагает ответчик, может быть единственным решением в данном конкретном случае.
Сначала вам нужно преобразовать в 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);
}
Это другое: он превращает последний || в &&.
Основная причина вашей проблемы в том, что ваши базовые данные не нормализованы должным образом. Вам нужно поместить свои CC в коллекцию, а не иметь их как одну разделенную строку.
В SQL вам нужно будет добавить новую таблицу с именем CC или что-то в этом роде, поместить туда каждое имя пользователя и связать его с выборами. Или, если это коллекция в памяти, добавьте новое свойство, которое в своем Getter выполнит разделение за вас.
В любом случае, вы не столкнетесь с подобными проблемами. Если ваши данные не структурированы должным образом, вы создадите проблемы для себя дальше по стеку.
Есть ли у вас какие-то исключения или что-то в этом роде ??