LinqToCRM не работает правильно - PullRequest
1 голос
/ 20 марта 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 ]

4 голосов
/ 22 марта 2011

У меня была похожая проблема с LINQ-to-CRM, и я вернулся к QueryExpressions, потому что они работали, пока я не нашел решение в некотором образце SDK, пока искал что-то еще: вам нужно добавить ProxyTypesBehavior к вашему IOrganizationService объект.Я не знаю, что он делает, но это определенно было изменение, которое позволило мне использовать LINQ с классами с ранним связыванием (как я понимаю, LINQ-to-CRM может только использоваться с раннимсвязанные классы).

Итак, после создания IOrganizationService вам понадобится строка:

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

Надеюсь, это поможет.

0 голосов
/ 20 марта 2011

Возвращает объект Entity, поэтому вам нужно вызвать ToEntity (), если вам нужен объект System User. Следующее должно работать для вас:

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>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...