【问题标题】:Linq select from CRM public viewLinq 从 CRM 公共视图中选择
【发布时间】:2015-04-12 13:25:40
【问题描述】:

我已经搜索了一段时间,但找不到如何从公共视图中查询。例如,我有一个名为 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 ...
}

这可能吗?

【问题讨论】:

  • 你只查询实体(表)而不是视图,所以如果你想在“Active Accounts”中搜索你需要条件“where statecode = 0”,你不能在“pre -filtered" 视图,因为在数据库的非常深处,您已经在查询过滤视图。
  • @Sxntk 谢谢你的解释。

标签: c# .net linq dynamics-crm


【解决方案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,但反之则不行。

可以通过编辑 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 和/或其他条件过滤您的查询。

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;

【讨论】:

    猜你喜欢
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2018-09-01
    相关资源
    最近更新 更多