2

CRM 2011に対してLINQクエリをどのようにコンパイルしますか?

Microsoft.Xrm.Client.dllを使用してCRM2011に接続し、app.configファイルの接続文字列から生成されたMicrosoft.Xrm.Client.CrmOrganizationServiceContext_SvcContextを使用しています。私は次のLINQクエリを持っています。これはうまく機能します。

var vdiConfigDataSet = 
   (from SvrToPubProfSet in _SvcContext.vdi_publicationprofile_vdi_serverSet
    join PubProfSet in _SvcContext.vdi_publicationprofileSet
    on SvrToPubProfSet.vdi_publicationprofileid equals PubProfSet.Id
    join SvrSet in _SvcContext.vdi_serverSet
    on SvrToPubProfSet.vdi_serverid equals SvrSet.Id
    where SvrSet.vdi_address == System.Environment.MachineName // This will ignore case

    select new
      {
        // Data from Server record
        RootPath = SvrSet.vdi_rootpath, // This is the same for all Publication Profiles
        SvrAddr = SvrSet.vdi_address,

        // Data from N:N relationship record(s) vdi_publicationprofile_vdi_serverSet
        SvrId = SvrToPubProfSet.vdi_serverid,
        PubProfId = SvrToPubProfSet.vdi_publicationprofileid,

        // Data from Publication Profile record(s)
        PubProfName = PubProfSet.vdi_name,
        RelativePath = PubProfSet.vdi_relativepath,
        ReportRelativePath = PubProfSet.vdi_reportrelativepath,
        ReportFilenameSeed = PubProfSet.vdi_reportfilenameseed,
        SubSystemType = PubProfSet.vdi_subsystemtype,
        ModifiedOn = PubProfSet.ModifiedOn
      }).ToList();

これは非常に大きなクエリであり、繰り返し実行されます。コンパイルしたいです。私は以下を試しました:

public static readonly Func<DataContext, Object> s_compiledQuery =
  CompiledQuery.Compile<DataContext, Object>
  (ctx  =>
  (from SvrToPubProfSet in ctx.GetTable<vdi_publicationprofile_vdi_server>()
   join PubProfSet in ctx.GetTable<vdi_publicationprofile>()
   on SvrToPubProfSet.vdi_publicationprofileid equals PubProfSet.Id
   join SvrSet in ctx.GetTable<vdi_server>()
   on SvrToPubProfSet.vdi_serverid equals SvrSet.Id
   where SvrSet.vdi_address == System.Environment.MachineName // This will ignore case

   select new
   {
     // Data from Server record
     RootPath = SvrSet.vdi_rootpath, // This is the same for all Publication Profiles
     SvrAddr = SvrSet.vdi_address,

     // Data from N:N relationship record(s) vdi_publicationprofile_vdi_serverSet
     SvrId = SvrToPubProfSet.vdi_serverid,
     PubProfId = SvrToPubProfSet.vdi_publicationprofileid,

     // Data from Publication Profile record(s)
     PubProfName = PubProfSet.vdi_name,
     RelativePath = PubProfSet.vdi_relativepath,
     ReportRelativePath = PubProfSet.vdi_reportrelativepath,
     ReportFilenameSeed = PubProfSet.vdi_reportfilenameseed,
     SubSystemType = PubProfSet.vdi_subsystemtype,
     ModifiedOn = PubProfSet.ModifiedOn
   }).ToList());
...

var vdiConfigDataSet2 = s_compiledQuery(_SvcContext); //ERROR _SvcContext is not DataContext type

しかし、型オブジェクトが必要であり、DataContext型オブジェクトからそれを取得する方法がわかりませんMicrosoft.Xrm.Client.CrmOrganizationServiceContext

DataContextCRM 2011のLINQクエリをコンパイルする際に、またはおそらくより洗練されたソリューションを取得する方法を知っている人はいますか?

4

1 に答える 1

0

CRM サービス コンテキスト プロキシは、Entity Framework のデータ コンテキストに基づいていません。代わりに、「内部」は ODATA / SOAP です。CompileQueryクラス ジェネリック引数は から継承する必要があるため、CRM クエリをコンパイルできませんObjectContext

調べたいことの 1 つは、次のパラメーターを使用することです。 CRM linq クエリで「ナビゲーション プロパティ」をトラバースすることで、結合を軽減します。

于 2012-10-25T15:57:59.757 に答える