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句なしで試したことがありますが、何も変わりません。

私は次のことを試しました(SystemUserの代わりにFirstOrDefaultとvarはありません)

            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サンプルで解決策が見つかるまで、QueryExpressionsに戻りました。オブジェクトにを追加する必要がありProxyTypesBehaviorますIOrganizationService。それが何をするのかはわかりませんが、それは間違いなく、初期バインドされたクラスでLINQを使用できるようにした変更でした(私が認識しているように、LINQ-to-CRMは初期バインドされたクラスでのみ使用できます)。

したがって、作成後に必要な行IOrganizationServiceは次のとおりです。

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

それがお役に立てば幸いです。

于 2011-03-22T09:46:39.217 に答える
0

Entityオブジェクトを返すため、システムユーザーオブジェクトが必要な場合は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 に答える