У меня есть требование запрашивать записи в 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, который генерируется в SQL Profiler, он выглядит так:
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
Итак, я получаю левое соединение ОК, но фильтр для предложения 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?