来自 CRM public 视图的 Linq select

Linq select from CRM public view

我已经搜索了一段时间,但找不到如何从 public 视图中查询。例如,我已经预定义了 public 名为 Active Accounts 的视图,我想从中获取数据。

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

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 ...
}

这可能吗?

public视图的查询定义存储在savedquery实体中,可以使用常用技术进行查询。

开箱即用的视图以固定 ID 存储,因此可以通过以下方式在 OrganizationServiceContext 对象上查询 Active Accounts

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 class,但并未实现其所有功能(例如,OUTER JOIN 是一个痛苦的遗漏)。因此,虽然可以将 LINQ 查询转换为 QueryExpression,但反之则不行。

可以通过编辑 Fetch XML 字符串来应用分页,但是如果那样太麻烦,您也可以考虑将 Fetch 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。相反,您需要根据 querytypenamereturnedtypecodeownerid and/or 其他条件过滤查询。

Dynamics CRM 也有一个 OrganizationRequest 允许您立即执行 savedquery。但是,它 returns 其结果作为结果集 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;