2012-03-07 10 views
2

私はLinqをSqlに使うことができると信じていますが、QueryExpressionsを使ってこれが可能かどうかを見たいと思っていました: -CRM 2011:クエリ式の制限?

私はエンティティAに対してクエリを行い、 (LinkEntityを介して)エンティティBに送信し、追加基準を課す。適切な属性名を追加することによって、エンティティBから列を取り出すことができます。ただし、リンクされたエンティティ(内部結合)のみを取得します。

Entity Aに関連するすべての関連レコード(および必須の列)をエンティティBから取得することは可能ですか?たとえば、連絡先が指定された条件を満たす連絡先に関連付けられているすべてのケース。通常、私は、クエリを反転し、適切なLinkEntity条件でエンティティBとエンティティBを検索することを検討しますが、同じ連絡先クエリに対して取得したいリンクされたエンティティがいくつかあります。

だから私はいくつかのオプションが残っています: -

(最初のクエリからの結果を多数繰り返し処理を行う場合ではない理想的な)(1)2番目のクエリを実行し、 (2)使用してクエリを実行しますフィルタリングされたビューのLinqからCRMへ (3)まったく別の方法ですか?

どのような考えにも感謝します。

はEDIT:

私は、このタスクを完了するためにLINQのツーSQLを使用して終了し、使用するコードは以下のものと同様である(さらにいくつかは、実際のクエリのために参加するとはいえ!): -

var dataCollection = (from eA in xrmServiceContext.EntityASet 

join eB in xrmServiceContext.EntityBSet on new EntityReference(EntityA.EntityLogicalName, eA.Id) equals (EntityReference)eB.EntityBLookupToEntityA 
select new 
{ 
    Id = eA.Id, 
    EntityBInterestingAttribute = eB.InterestingAttributeName 
} 

だから、これは簡単に物事を行うために、エンティティB.あたりのエンティティA、あたりの行を戻すことが私はその後、私はGridViewコントロールの充填のために一つのオブジェクトを返すことができるようにリストした特性を有していたカスタムクラス「MyEntityAClass」を定義しましたこれは、これらの結果の処理と関連していますが、私はここにそのコードを掲載していません。

私はそれが理にかなっていると思います。本質的には、レコードごとに複数の行を取得して、このメソッドを動作させます。

+0

アクティブになっているすべてのアカウントのアクティブなすべてのケースの最初の101を取得し、私はそのちょうど私確信しているが、私はあなたが作るしようとしているものを、クエリを理解していけませんか? SQLで必要なクエリを作成できますか?左側の外部ジョインはQueryExpressionでサポートされているので、必要なものは何ですか? – BenPatterson1

+0

こんにちはベン、ご意見ありがとうございます。内部結合を使用してSQLでクエリを実行することができ、予想される行数を取得します。エンティティAセットから選択し、ルックアップ属性に対してエンティティBに参加する。しかし、クエリ式を使用すると、Entity BIから列を取得しようとすると、エンティティBのN個の一致するレコードの1つから列を取り出すことしかできません。したがって、問題はリンクではあまりありませんが、複数のレコードが存在する場合(同じエンティティ別名と属性名)、関連レコードの必須属性。 –

+0

これはまだ明らかではない場合(私はそれが理解できない場合:)私は後で私の別のマシンに戻っているときにコードシナリオを投稿します。 –

答えて

-1

QueryExpressionは、QueryExpression.EntityNameで指定されたエンティティの1つのタイプのフィールドのみを返すことができます。

FetchXMLを使用すると、任意のリンクエンティティ(オプション3)のフィールドを取得することができます。残念なことに、XMLとしてデータを返します。これを解析する必要があります。

FetchXMLを実行する方が速いかもしれませんが、書き込みとテストには時間がかかり、どちらかを維持するのが最も簡単です。

サンプルコード、これは

string fetch = "<fetch count='101' mapping='logical'><entity name='account'><filter type='and'><condition attribute='statecode' operator='eq' value='1'/></filter><link-entity name='incident' from='customerid' to='accountid'><all-attributes/><filter type='and'><condition attribute='statecode' operator='eq' value='1'/></filter></link-entity></entity></fetch>"; 

string data = yourCrmServiceObject.Fetch(fetch); 
+0

* "QueryExpressionは、あるタイプのエンティティ(QueryExpression.EntityNameで指定されたもの)からのフィールドのみを返すことができます。" *これは明らかに間違っています。 LinkEntityとその属性は、FetchXmlと同じQueryExpressionに入れることができます。 – Filburt