2011-03-20 94 views
1

我想將所有查詢從QueryExpression更改爲Linq。在開發時,似乎都很好,但我總是在運行時得到一個轉換異常(無法將Microsoft.xrm.sdk.entity轉換爲Xrm.SystemUser - > Xrm是使用CrmSvcUtil生成的早期界類)。LinqToCRM不能正確投射

 var context = new OrganizationServiceContext(crmService); 
     SystemUser x = (from c in context.CreateQuery<SystemUser>() 
       where c.DomainName == @"pfgc\" + Environment.UserName 
       select c).FirstOrDefault(); 

此代碼很簡單。我甚至試過沒有Where子句,它不會改變任何東西。

我嘗試以下(無FirstOrDefault和VAR代替SystemUser)

  var x = (from c in context.CreateQuery<SystemUser>() 
       where c.DomainName == @"pfgc\" + Environment.UserName 
       select c); 

這不會拋出異常,但X型是Microsoft.xrm.sdk.linq.Query。我究竟做錯了什麼?這似乎正是SDK所要做的。

編輯:

GCATNM有正確的答案。萬一有人面臨着同樣的問題,這裏的工作代碼示例:

public SystemUser GetCurrentUser() 
    { 
     var context = GetOrgContext(); 
     return (from c in context.CreateQuery<SystemUser>() 
       where c.DomainName == @"pfgc\" + Environment.UserName 
       select c).FirstOrDefault(); 
    } 

    public OrganizationServiceContext GetOrgContext() 
    { 
     var serviceProxy1 = new OrganizationServiceProxy(organizationUri, homeRealmUri, credentials, null); 
     serviceProxy1.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior()); 
     return new OrganizationServiceContext(serviceProxy1); 
    } 

回答

3

我有一個類似的問題與LINQ到CRM,又回到QueryExpressions,因爲他們的工作,直到我發現了一些SDK樣本中的解決方案,同時在尋找別的東西:你需要爲您的IOrganizationService對象添加ProxyTypesBehavior。我不知道它做了什麼,但那絕對是允許我將LINQ與早期綁定類一起使用的變化(因爲我認爲它,LINQ到CRM可以使用只有與早期綁定類一起使用)。

所以你需要線創建後您的IOrganizationService是:

organizationService.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior()); 

我希望幫助。

+0

這是解決方案。我在看錯地方!非常感謝你! – Mathieu 2011-03-22 14:43:55

+3

是的,但你可以使用這個:svcOrg.EnableProxyTypes();-) – Coolweb 2011-04-22 07:09:59

+0

@Coolweb:確實,但我不知道那。 ;-) – TeaDrivenDev 2011-04-24 15:18:18

0

它返回一個實體對象,所以你需要調用ToEntity()如果​​你想有一個系統用戶對象。以下應爲你工作:

var context = new OrganizationServiceContext(crmService); 
    SystemUser x = (from c in context.CreateQuery<SystemUser>() 
      where (string)c["DomainName"] == @"pfgc\" + Environment.UserName 
      select c).FirstOrDefault().ToEntity<SystemUser>(); 
+0

謝謝你的回答。但它不幸地返回相同的異常。 – Mathieu 2011-03-21 03:22:40

+0

我更新了代碼示例。無效的轉換異常可能發生在where子句中。 – 2011-03-21 04:04:16

+0

它不會改變任何東西。即使沒有Where子句,它也會返回相同的異常。也許早期綁定不能用於Linq To CRM? – Mathieu 2011-03-21 12:51:41