2011-09-01 46 views
0

我有很多艱難地試圖獲得與CRM 2011工作的LINQ查詢。每當我有三個或更多的連接表(似乎不關心哪個CRM表),並且我嘗試添加一個WHERE子句(在我過濾的表上無關緊要)。如果我刪除WHERE子句,查詢運行良好,我可以遍歷結果集。我也可以離開WHERE子句,但刪除第三個連接,並且它也起作用。我已經用了很多CRM實體,並且得到了同樣的錯誤:「'Join'操作的結果選擇器必須返回兩個屬性的匿名類型。」它似乎有一個限制,如果我想要使用單個WHERE子句,我僅限於只連接兩個表。客戶關係管理2011 LINQ查詢具有多個內部聯接和單個WHERE子句(VB.NET)

我在發佈LINQ查詢時使用早期綁定CRM上下文生成的代碼方法。這是從CRM SDK示例中提取的代碼,除了我添加了WHERE子句。我無法找到如何做到這一點的例子。

Dim MyVar = From a In svcContext.AccountSet _ 
Join c In svcContext.ContactSet On a.PrimaryContactId.Id Equals c.ContactId _ 
Join l In svcContext.LeadSet On a.OriginatingLeadId.Id Equals l.LeadId _ 
Where a.Name.Contains("c") _ 
Select New With {c.FullName} 

For Each MyItem In MyVar 
    Debug.Print(MyItem.FullName) 
Next 

感謝您的任何幫助!

+0

你爲什麼加入svcContext.LeadSet,如果你不打算使用它呢? –

回答

0

我沒有CRM設置進行測試,看看它是否只是一個他們的供應商的限制,但你可以嘗試以下方法:

Dim MyVar = From a In svcContext.AccountSet _ 
    Where a.Name.Contains("c") _ 
    Join c In svcContext.ContactSet On a.PrimaryContactId.Id Equals c.ContactId _ 
    Join l In svcContext.LeadSet On a.OriginatingLeadId.Id Equals l.LeadId _ 
    Select c.FullName 

一對夫婦的評論:不像TSQL,操作順序在LINQ中更加靈活。這樣,您可以在進行連接之前限制您的第一張表格(具體取決於CRM提供商翻譯的方式)。

其次,你想知道「c」在名字中的任何地方,或只是在開始?如果在開始時考慮Where a.Name.StartsWith("c") 另一個評論,在你的選擇投影中,你不必要地投射到一個可枚舉的類中。如果您只是預測單個值,則不需要額外的類開銷。然後在你的foreach中,只需執行Debug.Print(MyItem),因爲MyItem是全名。同樣在VB中,當使用查詢語法時,您不需要New With {...}。如果你想突出一個匿名類型多列,你可以做以下的VB,就像你在SQL:

Dim query = From c In Customers 
      Select C.FullName, C.CompanyName 
+0

謝謝你的回報,吉姆。我已經嘗試過您建議的方法,並且我只是再次嘗試了您的代碼。當另一個JOIN跟隨它時,它不喜歡那個WHERE子句。我收到錯誤「方法'加入'不能遵循'Where'或不支持的方法。嘗試在支持的方法上編寫查詢,或在調用不支持的方法之前調用'AsEnumerable'或'ToList'方法。我將使用「Leads」表,以及結果集中的更多字段。這只是我試圖做的一個愚蠢的版本,無論如何都會得到相同的錯誤。 –

+0

不幸的是,這聽起來像是CRM提供商的限制。嘗試向供應商提供反饋。如果是微軟,請嘗試在http://connect.microsoft.com/上發帖 –

相關問題