Sitefinity - LINQ to SQL Ограничения?
В настоящее время я создаю собственный виджет MVC для проекта Sitefinity (v9.2).
В качестве части этого виджета существует запрос к базе данных для получения коллекции динамического типа модуля (статей). Я пытаюсь получить типы статей, которые содержат все метки в моем списке руководств Labels.PublicLabels.
Мой текущий запрос:
var collection = dynamicModuleManager.GetDataItems(articleType)
.Where(a => a.Status == Telerik.Sitefinity.GenericContent.Model.ContentLifecycleStatus.Live
&& a.Visible == true
&& Labels.PublicLabels.All(l => a.GetValue<IList<Guid>>("Public").Contains(l)));
Во время выполнения я получаю исключение, в котором говорится, что "сторона сервера не реализована" Может ли это быть ограничением OpenAccess?
Я пробовал широкий спектр комбинаций запросов LINQ to SQL, которые были успешными, и я пытаюсь понять проблему здесь.
Благодарим за любую идею!
ОБНОВЛЕНИЕ: я попробовал несколько вариантов одного и того же запроса, таких как:
var collection = dynamicModuleManager.GetDataItems(articleType)
.Where(a => a.Status == Telerik.Sitefinity.GenericContent.Model.ContentLifecycleStatus.Live
&& a.Visible == true
&& Labels.PublicLabels.Any(l => a.GetValue<IList<Guid>>("Public").Contains(l)));
Нет результата, я все еще получаю следующее сообщение об исключении:
Выполнение 'System.Linq.Enumerable: Any (IEnumerable1,Func
2) на стороне сервера базы данных в настоящее время не реализовано.
Будем весьма благодарны за любые дальнейшие советы, так как сейчас я предполагаю, что это связано с ограничениями OpenAccess в отношении LINQ to SQL.
2 ответа
Удалось решить эту проблему. Определенно вплоть до ограничений Open Access LINQ to SQL. Что я сделал, так это добавил дополнительное условие where после фильтрации коллекции настолько, насколько мне было нужно. Вот полный запрос:
var collection = dynamicModuleManager.GetDataItems(articleType).Where(a => a.Status == ContentLifecycleStatus.Live && a.Visible == true)
.OrderByDescending(a => a.PublicationDate)
.Distinct()
.Where(a => new HashSet<Guid>(a.GetValue<IList<Guid>>("Public")).IsSupersetOf(Labels.PublicLabels));
Я сообщу об этом в Sitefinity, и если им удастся исправить ситуацию, я сообщу об этом.
Спасибо всем вам за вашу поддержку!
У меня была такая же проблема раньше, этот способ работал для меня
var listIds = Labels.PublicLabels;
var collection = dynamicModuleManager.GetDataItems(articleType)
.Where(a => a.Status == ContentLifecycleStatus.Live && a.Visible == true)
.Where(a => a.GetValue<TrackedList<Guid>>("Public").Where(al => listIds.Contains(al)).Any());
Я не собирал это, дайте мне знать, если это не сработает для вас