Linq查询中SharePoint Lookup (Count Related)的值



我有两个列表,帖子和评论。Comments对Posts列表有一个Lookup列,Posts对Comments列表有一个Lookup (Count Relate)关系。我要做的只是显示每个帖子中的评论数量。由于某些原因,我不知道如何使用实体引用来做到这一点。

我有一个ArchiveItem类:
    public class ArchiveItem
    {
        public string Id { get; set; }
        public string Title { get; set; }
        public string Comments { get; set; }
        public string Date { get; set; }
    }

然后是我要运行的查询:

        var queryItems = from item in spotlightItems
                         join comment in commentItems on item.Title equals comment.Title
                         select new ArchiveItem
                         {
                             Id = item.Id.ToString(),
                             Title = item.Title,
                             Comments = comment.Post.Title.Count().ToString(),
                             Date = item.Date.ToString()
                         };

我尝试了几种不同的方法,得到了各种各样的错误消息。这个特殊的版本给我

查询使用不受支持的元素,例如对多个列表的引用,或者使用EntityRef/EntitySet对完整实体的投影。

任何想法?我认为这将是相当简单的,但也许我错过了一些东西。

Linq-to-Sharepoint不支持连接。在实际的数据库中,sharepoint列表并不是一个单独的表,sharepoint的实际数据模型并不是重点,但你应该记住,在普通SQL中逻辑简单的操作在CAML中并不那么简单,每个Linq-to-Sharepoint查询最终都会转换为CAML。

无论如何,不实现连接。您可以使用查找列的实体来获取数据,但在后台,这总是作为不同的查询实现,并且根据我的经验,您不能在这些查找实体上使用任何聚合或其他多记录操作,包括Count()。

可能有一个很好的方法来解决这个问题,因为count是一个很简单的函数。我会尝试转换属性,你想计数到一个数组(或类似),并使用长度或计数。

一般来说,解决这些问题的方法是在代码中进行数据处理,并依赖相当粗糙的查询。通过谨慎地选择正确的数据结构,你可以很好地加快运算速度。有几次,我体验到代码处理比linq-to-sharepoint查询解决方案的性能更好,尽管第一种情况下的查询会给数据库带来一定数量的不必要的数据流量。

还有一件事:如果你计划最终使用CAML或代码生成Sharepoint列表,并且你只在开发过程中使用"点击"内容类型/列表,请记住SPMetal在这些情况下生成的类是不同的。更具体地说,查找字段没有表示为实体类,而是表示为两个普通字段,一个带有项目Id,一个带有标题(更像SPListItem)。而且,反向查找实体集根本不存在。我没有见过这方面的文档,但我经历过。因此,如果您计划使用CAML生成的站点,您可能需要重新考虑一些查询。可能有一个解决方案,但根据我的经验,查找实体(集)无论如何都非常慢,最好使用普通的linq查询。

最新更新