【问题标题】:LinqToCRM does not cast properlyLinqToCRM 未正确投射
【发布时间】:2011-03-20 15:45:17
【问题描述】:

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

        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);
    }

【问题讨论】:

    标签: c# linq dynamics-crm dynamics-crm-2011


    【解决方案1】:

    我在使用 LINQ-to-CRM 时遇到了类似的问题,然后又回到了 QueryExpressions,因为它们有效,直到我在一些 SDK 示例中找到了解决方案,同时还在寻找其他东西:您需要将 ProxyTypesBehavior 添加到您的 @987654322 @ 目的。我不知道它做了什么,但这绝对是让我能够将 LINQ 与早期绑定类一起使用的变化(据我所知,LINQ-to-CRM 只能与早期绑定课程)。

    所以在创建IOrganizationService 后需要的行是:

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

    希望对你有帮助。

    【讨论】:

    • 这就是解决方案。我看错地方了!非常感谢!
    • 是的,但你可以使用这个:svcOrg.EnableProxyTypes() ;-)
    • @Coolweb:确实,但当时我并不知道。 ;-)
    • 另外值得注意的是,如果您在创建代理实例时代码中没有使用“using”语句,则必须直接在代理上调用“Dispose”方法。
    • ServiceConfiguration 不作为属性存在于 IOrganizationService 上,而是存在于 OrganizationServiceProxy 上。这怎么行?
    【解决方案2】:

    它返回一个实体对象,所以如果你想要一个系统用户对象,你需要调用 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>();
    

    【讨论】:

    • 感谢您的回答。但不幸的是它返回了同样的异常。
    • 我已经更新了代码示例。无效转换异常可能发生在 where 子句中。
    • 它不会改变任何东西。即使没有 Where 子句,它也会返回相同的异常。也许早期绑定不能与 Linq To CRM 一起使用?
    猜你喜欢
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    相关资源
    最近更新 更多