特定のタイプの関連エンティティを持たない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を見ると、次のようになります。
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
したがって、左結合は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要求の制限ですか?