2011-09-13 5 views
3

CRM 2011では、EarlyBoundEntitiesを使用して通常の作成、更新、削除操作を実行できます。しかし、同じ種類のコードを使用してエンティティのリストを取得する例を見つけることはできません。 EarlyBoundEntitiesを使用している型の項目のリストを取得する方法はありますか?エンティティリストの取得

私はMSDNを調べましたが、GUIDがすでに分かっている場合は、エンティティを取得する方法がわかりました。

// Retrieve the account containing several of its attributes. 
ColumnSet cols = new ColumnSet(
       new String[] { "name", "address1_postalcode", "lastusedincampaign" }); 

Account retrievedAccount = (Account)_service.Retrieve("account", _accountId, cols); 
Console.Write("retrieved, "); 

たとえば、電話番号がないすべてのアカウントのリストを取得するにはどうすればよいですか?

答えて

6

servicecontextnameパラメータを使用して事前バインドされたプロキシクラスを生成した場合、クエリ用にLINQを使用できます。

var context = new XrmServiceContext(service); 
var accounts = context.AccountSet.Where(item => item.Telephone1 == null); 

そうでない場合、あなたはまだあなたが望む早期結合型にすべてのインスタンスをキャストするためにLINQを使用することができ、そのようなのQueryExpressionなどの他のクエリメソッドを使用したい場合。

var contacts = service.RetrieveMultiple(new QueryExpression 
              { 
               EntityName = "contact", 
               ColumnSet = new ColumnSet("firstname") 
              }) 
    .Entities 
    .Select(item => item.ToEntity<Contact>()); 

あなたが好む場合にも拡張メソッドを使用することができます。

public static IEnumerable<T> RetrieveMultiple<T>(this IOrganizationService service, QueryBase query) where T : Entity 
{ 
    return service.RetrieveMultiple(query) 
     .Entities 
     .Select(item => item.ToEntity<T>()); 
} 

使用法:

var contacts = service.RetrieveMultiple<Contact>(new QueryExpression 
                 { 
                  EntityName = "contact", 
                  ColumnSet = new ColumnSet("firstname") 
                 }); 
+0

最初の例は、私が後にしたものです。他のものは、エンティティの名前を文字列としてコード化し、属性/エンティティが変更された場合にのみ実行時にエラーを生成する必要があるため、初期バインドされたエンティティの利点を基本的に(私にとっては)損なうものです。属性/エンティティを変更した場合、コンパイル時エラーが発生します。 – Mauro

1

実際にエンティティを照会する方法を示すMSDNのSDKには、多くの資料があります。

Create Queries to Retrieve Data

Build Queries with LINQ - 主に早期バインド例

例えば制限が(存在するもののAPIは、データベース(LINQ、FetchXml、及びのQueryExpression)を照会するには、3つの以上の以下の同等の方法を提供し、 LINQ limitationsを参照してください)。これは、オンプレミスインストールとネイティブSQL呼び出しを使用することで回避できます。

あなたが指定した電話番号がnullのアカウントの例では、サポートされている3つのクエリ方法のいずれも機能します。

+0

@Luke私はそれが情報が含まれているLINQページへのリンクだと仮定早期の事業体について ''コード生成ツール(CrmSvcUtil.exe)を使用するときに、servicecontextnameパラメータを使用してクラスの名前を指定した場合、アーリーバウンドプログラミングクラスを使用すると、OrganizationServiceContextクラスから派生したクラスを生成できます。 + Set(AccountSetなど)のパターンを使用してIQueryableエンティティセットを参照できるようにします。 " これを含めるために回答を編集します。 –