公共视图的查询定义存储在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。相反,您需要在querytype
,name
,returnedtypecode
,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;
你只查询实体(表)不所以如果你想在“Active Accounts”中搜索,你需要条件“where statecode = 0”,你不能在“预过滤”视图中搜索,因为数据库非常深,你已经查询过滤视图。 – Sxntk
@Sxntk谢谢你的解释。 –