C# LinqToCRM不能正确地施法

C# LinqToCRM不能正确地施法,c#,linq,dynamics-crm,dynamics-crm-2011,C#,Linq,Dynamics Crm,Dynamics Crm 2011,我想将所有查询从QueryExpression更改为Linq。在开发时,一切似乎都很好,但我总是在运行时遇到一个强制转换异常(无法将Microsoft.xrm.sdk.entity强制转换为xrm.SystemUser->xrm是使用CrmSvcUtil生成的早期绑定类) var context=新的OrganizationServiceContext(crmService); SystemUser x=(来自context.CreateQuery()中的c) 其中c.DomainName==@

我想将所有查询从QueryExpression更改为Linq。在开发时,一切似乎都很好,但我总是在运行时遇到一个强制转换异常(无法将Microsoft.xrm.sdk.entity强制转换为xrm.SystemUser->xrm是使用CrmSvcUtil生成的早期绑定类)

var context=新的OrganizationServiceContext(crmService);
SystemUser x=(来自context.CreateQuery()中的c)
其中c.DomainName==@“pfgc\”+Environment.UserName
选择c).FirstOrDefault();
这段代码很简单。我甚至尝试过不用Where子句,它不会改变任何事情

我尝试了以下操作(没有FirstOrDefault和var,而不是SystemUser)

var x=(来自context.CreateQuery()中的c)
其中c.DomainName==@“pfgc\”+Environment.UserName
选择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);
    }
公共系统用户GetCurrentUser()
{
var context=GetOrgContext();
返回(来自context.CreateQuery()中的c)
其中c.DomainName==@“pfgc\”+Environment.UserName
选择c).FirstOrDefault();
}
public OrganizationServiceContext GetOrgContext()
{
var serviceProxy1=新的OrganizationServiceProxy(organizationUri,homeRealmUri,credentials,null);
serviceProxy1.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(新的ProxyTypesBehavior());
返回新的OrganizationServiceContext(serviceProxy1);
}

它返回一个实体对象,因此如果需要系统用户对象,则需要调用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>();
var context=新的OrganizationServiceContext(crmService);
SystemUser x=(来自context.CreateQuery()中的c)
其中(字符串)c[“域名”]==@“pfgc\”+Environment.UserName
选择c).FirstOrDefault().ToEntity();

它返回一个实体对象,因此如果需要系统用户对象,则需要调用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>();
var context=新的OrganizationServiceContext(crmService);
SystemUser x=(来自context.CreateQuery()中的c)
其中(字符串)c[“域名”]==@“pfgc\”+Environment.UserName
选择c).FirstOrDefault().ToEntity();

我在LINQ to CRM上也遇到了类似的问题,并返回到QueryExpressions,因为它们工作正常,直到我在某个SDK示例中找到了解决方案,同时寻找其他东西:您需要将
ProxyTypesBehavior
添加到您的
IOOrganizationService
对象中。我不知道它做了什么,但这肯定是允许我将LINQ与早期绑定类一起使用的变化(据我所知,LINQ to CRM只能与早期绑定类一起使用)

因此,在创建
IOrganizationService
后,您需要的行是:

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

我希望这会有所帮助。

我在LINQ to CRM方面也遇到类似问题,并返回到QueryExpressions,因为它们可以工作,直到我在某个SDK示例中找到解决方案,同时寻找其他东西:您需要将
ProxyTypesBehavior
添加到您的
IOOrganizationService
对象中。我不知道它做了什么,但这肯定是允许我将LINQ与早期绑定类一起使用的变化(据我所知,LINQ to CRM只能与早期绑定类一起使用)

因此,在创建
IOrganizationService
后,您需要的行是:

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

我希望这能有所帮助。

谢谢你的回答。但不幸的是,它返回了相同的异常。我已经更新了代码示例。无效的强制转换异常可能发生在where子句中。它不会更改任何内容。即使没有Where子句,它也返回相同的异常。也许早期绑定不能与Linq To CRM一起使用?谢谢您的回答。但不幸的是,它返回了相同的异常。我已经更新了代码示例。无效的强制转换异常可能发生在where子句中。它不会更改任何内容。即使没有Where子句,它也返回相同的异常。也许早期绑定不能用于Linq到CRM?这是解决方案。我看错地方了!非常感谢你!是的,但您可以使用:svcOrg.EnableProxyTypes();-)@酷网:是的,但我当时不知道还值得注意的是,如果在创建代理实例时代码中未使用“using”语句,则必须直接在代理上调用“Dispose”方法。ServiceConfiguration不是IOOrganizationService上的属性,而是OrganizationServiceProxy上的属性。这是怎么回事?这就是解决办法。我看错地方了!非常感谢你!是的,但您可以使用:svcOrg.EnableProxyTypes();-)@酷网:是的,但我当时不知道还值得注意的是,如果在创建代理实例时代码中未使用“using”语句,则必须直接在代理上调用“Dispose”方法。ServiceConfiguration不是IOOrganizationService上的属性,而是OrganizationServiceProxy上的属性。这怎么行?