我目前正在为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)));
在运行时,我得到一个例外,提到“服务器端没有实现”。 这可能是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(IEnumerable 1,Func
2)'。
我们将非常感谢任何进一步的建议,现在我将假设这与围绕LINQ to SQL的OpenAccess限制有关。
答案 0 :(得分:1)
管理解决此问题。绝对是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报告此情况,如果他们设法妥善修复,我会报告回来。
感谢大家的支持!
答案 1 :(得分:0)
之前我遇到过同样的问题,这种方式对我有用
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());
我没有编译,请告诉我它是否适用于您