У меня есть требование запросить записи в CRM, что не имеют связанную сущность определенного типа. Обычно я делал это с помощью Left Outer Join, а затем фильтровал для всех строк с NULL в правой части.Dynamics CRM 2011 - Фильтрация запроса LINQ с внешними соединениями
Например:
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,
};
Это должно вернуть мне все Contats, которые не Primary Контакт счета. Однако этот запрос заканчивается возвратом всех контактов ...! Когда вы смотрите на 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?
В какой таблице используется столбец «Имя»? –
@ Hassan, Name - это поле объекта Account. Я просто выбрал поле, которое, как я думал, всегда должно иметь данные для этого примера. На самом деле мой запрос не существует между встроенными объектами. – Mark