来自 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。相反,您需要根据 querytype
、name
、returnedtypecode
、ownerid
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;
我已经搜索了一段时间,但找不到如何从 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。相反,您需要根据 querytype
、name
、returnedtypecode
、ownerid
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;