2012-10-02 28 views
2

如何編譯針對CRM 2011的LINQ查詢?如何編譯針對CRM 2011的LINQ查詢?

我使用Microsoft.Xrm.Client.dll連接到CRM 2011,並使用從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類型的對象。

任何人有任何想法如何獲得DataContext或者編譯CRM 2011的LINQ查詢更優雅的解決方案?

回答

0

CRM服務上下文代理不是基於實體框架的數據上下文,而是「底層」是ODATA/SOAP。您無法編譯CRM查詢,因爲CompileQuery類泛型參數必須從ObjectContext繼承。你可能想看看

有一件事是使用這個參數: /codeCustomization:"Microsoft.Xrm.Client.CodeGeneration.CodeCustomization,Microsoft.Xrm.Client.CodeGeneration」 隨着SDK的代碼生成工具(crmsvcutil。 exe),因爲這樣可以遍歷CRM linq查詢中的「導航屬性」,從而減輕您的連接。