Linq查询中的SharePoint查找(计数相关)值

时间:2011-04-22 16:24:12

标签: .net linq sharepoint linq-to-sharepoint

我有两个列表,帖子和评论。注释在帖子列表中有一个查找列,帖子的查找(计数相关)关系返回到注释列表。我想要做的只是显示每个帖子中的评论数量。出于某种原因,我无法通过实体引用来了解如何执行此操作。

我有一个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对完整实体的投影。

有什么想法吗?我认为这很简单,但也许我错过了一些东西。

1 个答案:

答案 0 :(得分:0)

Linq-to-Sharepoint不支持联接。一个sharepoint列表不是实际数据库中的单独表,sharepoint的实际数据模型不是重点,但是你应该记住,在纯粹的SQL中,逻辑上和廉价的操作在CAML中本身并不容易,并且每个Linq-to-Sharepoint查询最终都转换为CAML。

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

这可能是一个很好的方法,因为计数是一个如此简单的功能。我会尝试将您想要计数的属性转换为数组(或类似),并使用其长度或计数。

一般来说,围绕这些问题的方法是在代码中进行数据处理并依赖相当粗略的查询。通过投入一些精心选择正确的数据结构,您可以非常好地加快运营速度。有几次我通过代码处理获得了更好的性能,然后使用linq-to-sharepoint查询解决方案,即使第一种情况下的查询产生了一定数量的不必要的数据流量到数据库。

还有一件事:如果您计划最终使用CAML或代码生成您的Sharepoint列表,并且您仅在开发期间使用'clicked'内容类型/列表,请记住SPMetal在这些类中生成的类存在差异案例。更具体地说,查找字段不是作为实体类来表示,而是作为两个普通字段表示,使用项目Id和一个具有标题的字段(更像是在SPListItem中)。而且,反向查找 - 实体集根本不存在。我没有看到关于此的文档,但我已经体验过它。因此,如果您计划使用CAML生成的站点,则可能需要重新考虑某些查询。可能有一种解决方法,但根据我的经验,查找实体(集)无论如何都非常慢,并且最好使用普通的linq查询。

我希望这会有所帮助。