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,Func
2)'。
任何进一步的建议将不胜感激,现在我假设这是与 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 报告此事,如果他们设法进行适当的修复,我会反馈。
感谢大家的支持!
我目前正在为 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,Func
2)'。
任何进一步的建议将不胜感激,现在我假设这是与 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 报告此事,如果他们设法进行适当的修复,我会反馈。
感谢大家的支持!