Sitefinity - LINQ to SQL 限制?

Sitefinity - LINQ to SQL Limitations?

我目前正在为 Sitefinity (v9.2) 项目构建自定义 MVC 小部件。

作为此小部件的一部分,有一个查询数据库以检索动态模块类型(文章)的集合。我正在尝试获取包含我的 Labels.PublicLabels guid 列表中所有标签的文章类型。

我当前的查询是:

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

在运行时我得到一个异常提到'server side not implemented'。 这可能是 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)'。

任何进一步的建议将不胜感激,现在我假设这是与 LINQ 周围的 OpenAccess 限制有关 SQL。

我之前遇到过同样的问题,这个方法对我有用

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

我没有编译那个,如果它对你不起作用,请告诉我

设法解决了这个问题。绝对是 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 报告此事,如果他们设法进行适当的修复,我会反馈。

感谢大家的支持!