2011-03-20 55 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