2015-04-12 62 views
1

我已经搜索了一段时间,但无法找到如何从公共视图进行查询。例如,我有预定义的公共视图Active Accounts,我想从中获取数据。Linq从CRM公共视图中选择

到目前为止,我只知道这个方法,但不包括任何观点:

using (var xrm = new XrmServiceContext("Xrm")) 
{ 
    var activeAccounts = from a in xrm.AccountSet 
        where a.StateCode == 0 
        select new { a.Id, a.Name }; 

    // TODO ... 
} 

但我想这样做这样的(不工作,ActiveAccountsView不存在的,这是伪):

using (var xrm = new XrmServiceContext("Xrm")) 
{ 
    var activeAccounts = from a in xrm.ActiveAccountsView 
         select new { a.Id, a.Name }; 

    // TODO ... 
} 

这甚至可能吗?

+1

你只查询实体(表)不所以如果你想在“Active Accounts”中搜索,你需要条件“where statecode = 0”,你不能在“预过滤”视图中搜索,因为数据库非常深,你已经查询过滤视图。 – Sxntk

+0

@Sxntk谢谢你的解释。 –

回答

1

公共视图的查询定义存储在savedquery实体中,可以使用常用技术查询该实体。

出的现成的观点都存储有一个固定的ID,所以查询活跃帐户OrganizationServiceContext对象可以通过以下方式进行:

private static IEnumerable<Entity> GetActiveAccounts(OrganizationServiceContext serviceContext) 
{ 
    string fetchXml = serviceContext 
     .CreateQuery("savedquery") 
     .Where(sq => 
      sq.GetAttributeValue<Guid>("savedqueryid") == new Guid("00000000-0000-0000-00AA-000010001002")) 
     .Select(sq => sq.GetAttributeValue<string>("fetchxml")) 
     .First(); 

    var request = new RetrieveMultipleRequest 
    { 
     Query = new FetchExpression(fetchXml) 
    }; 

    var response = (RetrieveMultipleResponse) serviceContext.Execute(request); 

    return response.EntityCollection.Entities; 
} 

这是不可能的使用LINQ在这里。 LINQ依赖QueryExpression类,但并未实现其所有功能(例如,OUTER JOIN是一个痛苦的省略)。所以,尽管可以将LINQ查询转换为QueryExpression,但另一种方式则不然。

寻呼可以通过编辑获取XML字符串被应用,但如果这是太多的麻烦,你也可以考虑到获取XML转换为QueryExpression和对象上应用分页:

private IEnumerable<Entity> GetActiveAccounts(int pageNumber) 
{ 
    string fetchXml = _serviceContext 
     .CreateQuery("savedquery") 
     .Where(sq => 
      sq.GetAttributeValue<Guid>("savedqueryid") == new Guid("00000000-0000-0000-00AA-000010001002")) 
     .Select(sq => sq.GetAttributeValue<string>("fetchxml")) 
     .First(); 

    var conversionRequest = new FetchXmlToQueryExpressionRequest 
    { 
     FetchXml = fetchXml 
    }; 

    var response = (FetchXmlToQueryExpressionResponse)_serviceContext.Execute(conversionRequest); 
    response.Query.PageInfo = new PagingInfo { Count = 1, PageNumber = pageNumber }; 

    var queryRequest = new RetrieveMultipleRequest 
    { 
     Query = response.Query 
    }; 

    var result = (RetrieveMultipleResponse) _serviceContext.Execute(queryRequest); 
    return result.EntityCollection.Entities; 
} 

附加QueryExpression与Fetch XML的优点在于它以更高效的方式进行处理。

用户自定义视图完全相同;这些视图存储在userquery实体中。唯一的区别是你不能依靠固定的视图ID。相反,您需要在querytypenamereturnedtypecode,ownerid和/或其他标准上过滤您的查询。

Dynamics CRM也有一个OrganizationRequest,允许您立即执行savedquery。但是,它将结果作为结果集XML字符串返回,因此您仍然需要反序列化该响应。 (一个很好的例子可以发现here)。另外,我不知道是否有可能以限制结果使用时设置为特定页面的ExecuteByIdSavedQueryRequest

var request = new ExecuteByIdSavedQueryRequest 
{ 
    EntityId = new Guid("00000000-0000-0000-00AA-000010001002") 
}; 

var response = (ExecuteByIdSavedQueryResponse)serviceContext.Execute(request); 

string resultset = response.String;