公共視圖的查詢定義存儲在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謝謝你的解釋。 –