crm 插件中的派生查询
derived query in crm plugin
有没有办法为 CRM 插件编写派生查询?
这里是 CRM 开发的新手。
查询如下所示:
SELECT * FROM table1
WHERE table1.ID1 = XXXX AND table1.ID2 NOT IN (
SELECT table2.ID1
FROM table2
WHERE table2.ID2 = XXXX)
正在使用查询表达式编写代码。
不幸的是,这些复杂的 sql 查询无法通过 fetchxml 或 queryexpression 查询来实现。特别喜欢Subqueries,不在场景
可能您需要多个结果集 (EntityCollection),一个用于 table1,另一个用于 table2,然后遍历它。
另一个选择是LINQ queries,你可以试试
附带说明一下,您可以vote this idea提高查询能力。
如果你真的在使用 CRM 2011,我上次检查过,这是不可能的,较新的版本 (2013+) 你可以执行这种类型的查询。
请看这篇文章:https://msdn.microsoft.com/en-us/library/dn481591.aspx?f=255&MSPPError=-2147217396
var qe = new QueryExpression("table1");
var link = qe.AddLink("table2", "id2", "id1", JoinOperator.LeftOuter);
link.LinkCriteria.AddCondition("id2", ConditionOperator.Equal "XXXX")
link.EntityAlias = "notIn";
qe.Criteria = new FilterExpression();
qe.Criteria.AddCondition("id1", ConditionOperator.Equal, "XXXX");
qe.Criteria.AddCondition("notIn", "id1", ConditionOperator.Null);
您可以将此表达式与 LINQ for CRM:
一起使用
OrganizationServiceContext oservice = new OrganizationServiceContext(service);
using (oservice)
{
var query = (from table1 in oservice.CreateQuery("new_table1")
join table2 in oservice.CreateQuery("new_table2") on table1["new_table1id"]
equals table2["new_table2id"]
where
table1.GetAttributeValue<EntityReference>("new_id1")
== new Guid("the equal guid or field")
where
table2.GetAttributeValue<EntityReference>("new_id2").Id
!= table1.GetAttributeValue<EntityReference>("new_id1").Id
&& table2.GetAttributeValue<EntityReference>("new_id2").Id
== new Guid("the not equal guid or field")
select table1).ToList();
}
这是QueryExpression的另一种方式。 oservice.CreateQuery("new_table1")
是您在 CRM 中的实体名称
这也适用于 CRM 2011。
有没有办法为 CRM 插件编写派生查询? 这里是 CRM 开发的新手。
查询如下所示:
SELECT * FROM table1
WHERE table1.ID1 = XXXX AND table1.ID2 NOT IN (
SELECT table2.ID1
FROM table2
WHERE table2.ID2 = XXXX)
正在使用查询表达式编写代码。
不幸的是,这些复杂的 sql 查询无法通过 fetchxml 或 queryexpression 查询来实现。特别喜欢Subqueries,不在场景
可能您需要多个结果集 (EntityCollection),一个用于 table1,另一个用于 table2,然后遍历它。
另一个选择是LINQ queries,你可以试试
附带说明一下,您可以vote this idea提高查询能力。
如果你真的在使用 CRM 2011,我上次检查过,这是不可能的,较新的版本 (2013+) 你可以执行这种类型的查询。 请看这篇文章:https://msdn.microsoft.com/en-us/library/dn481591.aspx?f=255&MSPPError=-2147217396
var qe = new QueryExpression("table1");
var link = qe.AddLink("table2", "id2", "id1", JoinOperator.LeftOuter);
link.LinkCriteria.AddCondition("id2", ConditionOperator.Equal "XXXX")
link.EntityAlias = "notIn";
qe.Criteria = new FilterExpression();
qe.Criteria.AddCondition("id1", ConditionOperator.Equal, "XXXX");
qe.Criteria.AddCondition("notIn", "id1", ConditionOperator.Null);
您可以将此表达式与 LINQ for CRM:
一起使用OrganizationServiceContext oservice = new OrganizationServiceContext(service);
using (oservice)
{
var query = (from table1 in oservice.CreateQuery("new_table1")
join table2 in oservice.CreateQuery("new_table2") on table1["new_table1id"]
equals table2["new_table2id"]
where
table1.GetAttributeValue<EntityReference>("new_id1")
== new Guid("the equal guid or field")
where
table2.GetAttributeValue<EntityReference>("new_id2").Id
!= table1.GetAttributeValue<EntityReference>("new_id1").Id
&& table2.GetAttributeValue<EntityReference>("new_id2").Id
== new Guid("the not equal guid or field")
select table1).ToList();
}
这是QueryExpression的另一种方式。 oservice.CreateQuery("new_table1")
是您在 CRM 中的实体名称
这也适用于 CRM 2011。