2015-04-12 61 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;