Sitefinity - LINQ to SQL限制?

时间:2017-04-04 19:36:27

标签: c# sql linq telerik 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)));

在运行时,我得到一个例外,提到“服务器端没有实现”。  这可能是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限制有关。

2 个答案:

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

我没有编译,请告诉我它是否适用于您