我需要在 CRM 中查询没有特定类型相关实体的记录。通常,我会使用左外连接来执行此操作,然后过滤右侧所有具有 NULL 的行。
例如:
var query = from c in orgContext.CreateQuery<Contact>()
join aj in orgContext.CreateQuery<Account>()
on c.ContactId equals aj.PrimaryContactId.Id
into wonk
from a in wonk.DefaultIfEmpty()
where a.Name == null
select new Contact
{
FirstName = c.FirstName,
LastName = c.LastName,
};
这应该向我返回任何不是帐户主要联系人的联系人。但是,此查询最终会返回所有联系人...!当您查看在 SQL Profiler 中生成的 SQL 时,结果如下:
SELECT cnt.FirstName, cnt.LastName
FROM Contact as cnt
LEFT OUTER JOIN Account AS acct
ON cnt.ContactId = acct.PrimaryContactId AND acct.Name is NULL
所以,我得到了 Left Join OK,但过滤器在Join
子句上,而不是在子句中。而不是它WHERE
应该的,像这样:
SELECT cnt.FirstName, cnt.LastName
FROM Contact as cnt
LEFT OUTER JOIN Account AS acct
ON cnt.ContactId = acct.PrimaryContactId
WHERE acct.Name is NULL
显然,此查询的结果非常不同!有没有办法让 CRM 上的查询生成正确的 SQL?
这是底层 FetchXML 请求的限制吗?