2011-04-22 69 views
0

我有兩個列表,帖子和評論。評論有一個查閱列的帖子列表,並且帖子有一個查找(計數相關)關係回到評論列表。我想要做的只是在每篇文章中顯示評論數量。出於某種原因,我無法知道如何使用實體參考做到這一點。Linq查詢中的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的完整實體的投影。

任何想法?我認爲這很簡單,但也許我錯過了一些東西。

回答

0

Linq-to-Sharepoint不支持連接。一個共享點列表並不是實際數據庫中的一個單獨的表,實際的共享點數據模型不是重點,但您應該記住,在普通SQL中,邏輯和便宜的操作在CAML中本身並不容易,並且每個Linq到Sharepoint查詢最終轉換爲CAML。

無論如何,連接沒有實現。您可以使用查詢列的實體來獲取數據,但在後臺,這總是作爲一個不同的查詢來實現,根據我的經驗,您不能在這些查找的實體上使用任何聚合或其他多記錄操作,包括計數()。

這可能是一個很好的解決方法,因爲count是一個非常簡單的函數。我會嘗試將你想要計數的屬性轉換爲一個數組(或類似的),並使用它的長度或數量。

通常,解決這些問題的方法是在代碼中進行數據處理,並依賴相當粗略的查詢。並且通過投入一些精心選擇正確的數據結構,您可以非常好地加速操作。儘管第一種情況下的查詢產生了一定量的數據庫不必要的數據流量,但我多次在代碼處理方面經歷了更好的性能,然後使用了linq-to-sharepoint查詢解決方案。還有一件事:如果您打算最終使用CAML或代碼生成您的Sharepoint列表,並且您僅在開發過程中使用了「單擊的」內容類型/列表,請記住,SPMetal在類中生成的類有所不同這些情況。更具體地說,查找字段不是作爲實體類來表示的,而是作爲兩個正常字段來表示的,其中具有項目Id,並且具有標題(更像是在SPListItem中)。而且,反向查找實體集完全不存在。我還沒有看到關於這方面的文檔,但我已經體驗過它。因此,如果您打算使用CAML生成的網站,則可能需要重新考慮一些查詢。可能有一個解決方法,但以我的經驗來看,Lookup Entity(sets)反正非常慢,最好使用普通的linq查詢。

我希望這會有所幫助。