1

我想将所有查询从 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);
    }
4

2 回答 2

4

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

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

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

我希望这会有所帮助。

于 2011-03-22T09:46:39.217 回答
0

它返回一个 Entity 对象,因此如果您想要一个 System User 对象,则需要调用 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>();
于 2011-03-20T17:46:31.807 回答