2011-12-02 152 views
0

我看到有關使用SPMetal生成允許LINQ正常工作的.cs文件的文章。我正在討論的文件是從Microsoft.SharePoint.Linq.DataContext類繼承而來的。如何在我的生產環境中使用LINQ而無需重新編譯,因爲我需要在生產環境中使用SPMetal重新生成此文件?我懷疑答案是「不能做到」。將SP-Linq查詢從測試站點移動到生產站點

我想我會使用CAML查詢,除非有一些更簡單的方法來使用我錯過的LINQ。

+0

爲什麼重新編譯會成爲問題? –

+0

這似乎是Sharepoint的一個常見問題。我不明白MS如何解決在多種環境下工作的人員。完整的PITA。 – leppie

回答

1

如果目標只是查詢使用LINQ的列表,並且您希望避免此類重新編譯,請不要使用SPMetal。 LINQ可以直接用於SPListItemCollection 例如

var FindCustomer = from SPListItem Item in Customers.Items 
         where Item["Orders"] as int == 5 
         select Item; 

//或選擇新的{標題=項目[ 「標題」]}

這沒有硬編碼的實體,但更靈活。只要列表列名保持不變,即使其他列表正在更改,代碼也可以部署在任何環境中。 此外,您可以選擇檢索少量所選字段的數據,而不是每次檢索所有字段的數據。

+0

什麼是「ApplicationList」和ApplicationList.Items?什麼是Common.ApplicationListFields.APPLICATIONID?假設我的SPList被命名爲Customers,並且我的列名稱是Orders,並且我想要檢索Orders = 5的所有客戶,請重新格式化上述代碼。我不打算懶惰,但我認爲這將幫助我理解這是如何適用於我正在做的事情。謝謝。 – KyleM

+0

修改了您的場景的代碼。你得到的結果是一個枚舉變量。您可以將.ToLis ()添加到var以獲取SPListItem的通用列表。或者你可以通過使用select new {Title = Item [「Title」],Orders = Item [「Orders」]}進入匿名類型} – justforkix09

0

我猜想沒有問題。就我個人而言,我一直在使用Linq很多時間。我從來沒有專門爲生產生成cs。您的網站在不同環境下有所不同

+0

是的,你明白了。該網站在各個環境中並不完全相同。我想我可以改變.cs文件以手動解決差異。我希望有一種方法可以使用我的select語句,並在沒有額外文件的情況下使用它。如果我的意思是「從客戶那裏選擇x,然後我已經提供了URL,那麼這樣做是可行的。但不幸的是,這不是LINQ的工作原理。 – KyleM

+0

即使我們走向數據庫的關係世界,您也會期望您的環境中的數據結構具有相似性。你不能寫一個完全不相關的數據結構。我猜想爲什麼數據結構在不同的環境中是不一樣的。我的意思是用例驅使它們與衆不同。 –

+0

有相似之處。這些列表都是文檔庫,名稱相同,列名和類型相同。我所說的是,如果這是查詢該列表所需的唯一信息,那將很方便。也許我需要深入研究SPMetal來生成這些信息。 – KyleM

0

我不知道我是否錯過了這一點,但DataContext對象將URL作爲構造函數的一部分,所以你應該從配置的某個地方檢索URL。數據庫

DataContext teamSite = new DataContext("http://MarketingServer/SalesTeam"); 

或者如果您的代碼具有SharePoint上下文,則使用SPContext對象。例如。在web部分

DataContext teamSite = new DataContext(SPContext.Current.Web.Url); 
+0

是的,你確實錯過了這一點,但沒關係。要點是我的環境有些不同。 LINQ沒有辦法AFAIK來考慮不同的測試和生產環境。我看到的唯一解決方案是手動編輯由SPMetal生成的.cs文件,並對其進行更改以使其與生產環境相匹配。不值得它IMO。 – KyleM