2012-10-02 1 views
2

Comment compilez-vous les requêtes LINQ par rapport à CRM 2011?Comment compilez-vous les requêtes LINQ avec CRM 2011?

Je me connecte à CRM 2011 à l'aide de Microsoft.Xrm.Client.dll et utilise Microsoft.Xrm.Client.CrmOrganizationServiceContext _SvcContext qui est généré à partir d'une chaîne de connexion dans le fichier app.config. J'ai la requête LINQ suivante qui fonctionne très bien:

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(); 

Ceci est une requête assez importante qui est exécutée à plusieurs reprises. Je veux le compiler. Je l'ai essayé ce qui suit:

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 

mais je besoin d'un objet de type DataContext et je ne sais pas comment obtenir que de l'objet de type Microsoft.Xrm.Client.CrmOrganizationServiceContext.

Quelqu'un at-il des idées pour obtenir le DataContext ou peut-être une solution plus élégante sur la compilation de requêtes LINQ pour CRM 2011?

Répondre

0

Le proxy de contexte de service CRM n'est pas basé sur le contexte de données d'Entity Framework, à la place "sous les couvertures" est ODATA/SOAP. Vous ne pouvez pas compiler une requête CRM car l'argument générique CompileQuery de classe doit hériter de ObjectContext.

Une chose que vous pouvez regarder en utilise ce paramètre: /codeCustomization:"Microsoft.Xrm.Client.CodeGeneration.CodeCustomization, Microsoft.Xrm.Client.CodeGeneration » Avec l'outil de génération de code du SDK (de crmsvcutil. exe) car cela permettra de parcourir les "propriétés de navigation" dans une requête linq CRM, allégeant ainsi vos jointures.