如何针对 CRM 2011 编译 LINQ 查询?
我使用 Microsoft.Xrm.Client连接到 CRM 2011.dll并使用从 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 查询?
CRM服务上下文代理不是基于实体框架的数据上下文,而是"幕后"是ODATA/SOAP。您无法编译 CRM 查询,因为 CompileQuery
类泛型参数必须继承自 ObjectContext
。
您可能需要研究的一件事是使用此参数: /codeCustomization:"Microsoft.Xrm.Client.CodeGeneration.CodeCustomization, Microsoft.Xrm.Client.CodeGeneration"使用 SDK 的代码生成工具 (crmsvcutil.exe),这将允许遍历 CRM linq 查询中的"导航属性",从而减轻联接。