2

特定のタイプの関連エンティティを持たない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になりますが、フィルターは句にあり、句にはありません。また、のようになります。JoinWHERE

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要求の制限ですか?

4

3 に答える 3

7

残念ながら、これはCRMのLINQおよびFetchXML実装の制限です。SDKのこのページには、外部結合はサポートされていないと記載されています。

http://technet.microsoft.com/en-us/library/gg328328.aspx

公式ドキュメントは見つかりませんが、FetchXMLが左外部結合をサポートしていないことに言及している人には多くの結果があります。たとえば、次のようになります。

http://gtcrm.wordpress.com/2011/03/24/fetch-xml-reports-for-crm-2011-online/

于 2011-06-13T16:20:43.127 に答える
1

これを試して:

var query = from c in orgContext.CreateQuery<Contact>()
            where orgContext.CreateQuery<Account>().All(aj => c.ContactId != aj.PrimaryContactId.Id)                
            select new Contact
            {
                   FirstName = c.FirstName,
                   LastName = c.LastName,
            };
于 2011-06-13T14:19:00.877 に答える
0

エンティティを更新する必要がない場合(たとえば、対応するすべての検証ルールとワークフローステップを処理するため)、SQL Serverに直接アクセスすることで、醜くなく効率的なクエリを作成できます。

CRMのパターンに従って、ビューはほとんどの一般的な結合を処理します。たとえば、dbo.ContactBasedbo.ContactExtensionBaseテーブルはすでにビューで結合されていますdbo.Contact。AccountNameはすでに存在します(奇妙な理由でAccountIdNameと呼ばれますが、少なくとも存在します)。

于 2013-07-31T20:44:09.330 に答える