LinqToCRM没有正确播放

时间:2011-03-20 15:45:17

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

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

2 个答案:

答案 0 :(得分:4)

我遇到了LINQ-to-CRM的类似问题并回到了QueryExpressions,因为它们有效,直到我在寻找其他东西时在某些SDK示例中找到了解决方案:您需要向您添加ProxyTypesBehavior IOrganizationService对象。我不知道它做了什么,但这肯定是允许我在早期绑定类中使用LINQ的变化(因为我认为,LINQ-to-CRM可以与早期约束类。)

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

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

我希望有所帮助。

答案 1 :(得分: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>();