Sitefinity — ограничения LINQ to SQL?

В настоящее время я создаю собственный виджет MVC для проекта Sitefinity (v9.2).

В составе этого виджета есть запрос к базе данных для получения коллекции динамического типа модуля (статьи). Я пытаюсь получить типы статей, содержащие все метки в моем списке GUID 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,Func2) на стороне сервера базы данных в настоящее время не реализовано.

Будем очень признательны за любые дополнительные советы, пока я предполагаю, что это связано с ограничениями OpenAccess в отношении LINQ to SQL.


person Mr Sheriff    schedule 04.04.2017    source источник
comment
Каков тип поля Public в вашем динамическом модуле?   -  person Veselin Vasilev    schedule 05.04.2017
comment
Привет, общественное поле — это классификация. Так что это будет TrackedList‹Guid›...   -  person Mr Sheriff    schedule 05.04.2017


Ответы (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, и если им удастся установить надлежащее исправление, я сообщу об этом.

Спасибо всем вам за вашу поддержку!

person Mr Sheriff    schedule 05.04.2017

У меня была такая же проблема раньше, этот способ работал для меня

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());

Я не компилировал это, дайте мне знать, если это не сработает для вас

person Victor Leontyev    schedule 05.04.2017
comment
Привет, хотя ваш запрос сработал, я пробовал что-то подобное заранее, но он не возвращает то, что мне нужно. Мне нужно получить все пользовательские типы статей, которые содержат все ярлыки в моем списке общедоступных ярлыков. Приведенный выше запрос вернет все статьи, содержащие любой ярлык в общедоступном списке. Имеет ли это смысл? - person Mr Sheriff; 05.04.2017