2017-04-04 17 views
1

我目前正在为Sitefinity(v9.2)项目构建一个自定义MVC小部件。Sitefinity - LINQ to SQL限制?

作为此小部件的一部分,存在对数据库的查询以检索动态模块类型(文章)的集合。我试图获取包含我的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查询组合,这些组合已经成功,我很努力地在这里理解这个问题。

任何想法将不胜感激!

UPDATE: 我曾尝试,如在同一查询几个变化:

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:任何(IEnumerable 1,Func 2)'在数据库服务器端目前未实现。

任何进一步的意见,将不胜感激,现在我会认为这是关于LINQ to SQL的OpenAccess限制。

+0

动态模块中“公共”字段的类型是什么? –

+0

你好,公共领域是一个分类。所以这将是一个TrackedList ... –

回答

1

设法解决这个问题,它不会工作。绝对可以达到开放获取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报告此事,如果他们设法妥善解决问题,我会报告回来。

谢谢大家的支持!

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

我没编译,让我知道如果你

+0

嗨,虽然你的查询确实有效,但我事先做了类似的事情,但它并没有返回我之后的事情。我需要获取包含我公共标签列表中所有标签的所有自定义文章类型。上面的查询将返回公共列表中包含任何标签的所有文章,这是否有意义? –