LINQ を使用したクエリの構築

 

公開日: 2017年1月

対象: Dynamics 365 (online)、Dynamics 365 (on-premises)、Dynamics CRM 2016、Dynamics CRM Online

.NET 統合言語クエリ (LINQ) の Microsoft Dynamics 365 (オンラインおよび設置型) クエリ プロバイダーでは、標準の LINQ 構文が使用されます。 LINQ クエリを作成するには、最初に関連するエンティティの種類およびそれらの関係を特定します。 その後、データ ソースや他のクエリ パラメーターを指定します。

from 句は、単一の "ルート" エンティティに戻るために使用されます。 クエリ プロバイダーは 1 種類のエンティティにのみ戻ることができます。orderby 句および select 句は、このルート エンティティを参照する必要があります。 "ルート" エンティティとの関係を追加するには join 句を使用します。

このトピックの内容

LINQ 演算子

LINQ の制限

複数のエンティティのフィルター処理

LINQ 演算子

すべての LINQ クエリ式は類似した形式を持っています。 次の表で、Microsoft Dynamics 365 LINQ クエリ プロバイダーを使用する際の最も一般的な LINQ クエリ式を示します。

LINQ 演算子

説明

データ ソースの取得 (from 句)

生成されたサービス コンテキストで事前バインドを行う場合、生成されたコンテキスト内で IQueryable エンティティ セット (AccountSet など) を使用します。

生成されたコンテキストを使用しない場合、組織サービス コンテキスト オブジェクトの CreateQuery メソッドを使用して Microsoft Dynamics 365 エンティティにアクセスできます。

生成されたサービス コンテキストを使用する場合

var query1 = from c in context.ContactSet
select c;

CreateQuery メソッドを使用する場合

var query1 = from c in context.CreateQuery<Contact>()
select c;

join

join 句は内部結合を表します。 共通の属性値を持つ 2 つ以上のエンティティを操作する場合に使用します。

from c in context.ContactSet
join a in context.AccountSet on c.ContactId equals a.PrimaryContactId.Id

フィルタリング (where 句)

where 句では、一般にブール式を使用して結果にフィルターを適用します。 フィルターは、ソース シーケンスから除外する要素を指定します。 各 where 句には 1 種類のエンティティに対する条件のみを含めることができます。 複数のエンティティが関係する複合条件は無効です。 このような場合は、各エンティティを個別の where 句でフィルタリングする必要があります。

from a in context.AccountSet
where (a.Name.StartsWith("Contoso") && a.Address1_StateOrProvince == "WA")

orderby

orderby 演算子は、返されたクエリ属性を指定された順番に並べます。

var query1 = from c in context.CreateQuery<Contact>()   
    orderby c.FullName ascending   
    select c;
foreach ( var q in query1)   
{
    Console.WriteLine(q.FirstName + " " + q.LastName);   
}

select

select 句は、返されるデータのフォームを指定します。 この句は、クエリ式の結果に基づいた列セットを作成します。 作業に使用する新しいオブジェクトのインスタンスを定義することもできます。select 句を使用して新しく作成されたオブジェクトは、サーバー上ではなくローカルでインスタンスとして作成されます。

select new Contact   
{
    ContactId = c.ContactId,
    FirstName = c.FirstName,
    LastName = c.LastName,
    Address1_Telephone1 = c.Address1_Telephone1   
};

LINQ の制限

LINQ クエリ プロバイダーは LINQ 演算子のサブセットをサポートします。 LINQ で表現できるすべての条件がサポートされているわけではありません。 次の表に、基本的な LINQ 演算子の制限の一部を示します。

LINQ 演算子

制限

join

内部結合または外部結合を表します。 左外部結合のみがサポートされます。

from

1 クエリにつき 1 つの from 句をサポートします。

where

句の左側は属性名、右側は値である必要があります。 左側に定数を設定することはできません。 句の両側を定数にすることはできません。

String 関数の ContainsStartsWithEndsWith、および Equals をサポートします。

groupBy

サポートされていません。 FetchXML では、LINQ クエリ プロバイダーで使用できないグループ化オプションがサポートされています。詳細: FetchXML 集計の使用

orderBy

エンティティ属性 (Contact.FullName など) による並べ替えがサポートされています。

select

匿名型、コンストラクター、初期化子がサポートされています。

last

last 演算子はサポートされていません。

skip および take

サーバー側のページングを使用する skip および take はサポートされています。skip の値は take の値以上である必要があります。

aggregate

サポートされていません。 FetchXML では、LINQ クエリ プロバイダーで使用できない集計オプションがサポートされています。詳細: FetchXML 集計の使用

複数のエンティティのフィルター処理

.NET 統合言語クエリ (LINQ) および Microsoft Dynamics 365 では、複数の Microsoft Dynamics 365 (オンライン) クエリを作成できます。 フィルター句を指定して複数の Join 句を使用し、複数のエンティティからの属性をフィルター処理した結果を作成します。

次のサンプルは、2 つのエンティティを操作し、各エンティティからの値に基づき結果をフィルター処理する LINQ クエリの作成方法を示します。


using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
{
 var query_where3 = from c in svcContext.ContactSet
                    join a in svcContext.AccountSet
                    on c.ContactId equals a.PrimaryContactId.Id
                    where a.Name.Contains("Contoso")
                    where c.LastName.Contains("Smith")
                    select new
                    {
                     account_name = a.Name,
                     contact_name = c.LastName
                    };

 foreach (var c in query_where3)
 {
  System.Console.WriteLine("acct: " +
   c.account_name +
   "\t\t\t" +
   "contact: " +
   c.contact_name);
 }
}

Using svcContext As New ServiceContext(_serviceProxy)
 Dim query_where3 = From c In svcContext.ContactSet _
                    Join a In svcContext.AccountSet _
                    On c.ContactId Equals a.account_primary_contact.Id _
                    Where a.Name.Contains("Contoso") _
                    Where c.LastName.Contains("Smith") _
                    Select New With {Key .account_name = a.Name,
                                     Key .contact_name = c.LastName}

 For Each c In query_where3
  Console.WriteLine("acct: " &amp; c.account_name &amp; vbTab &amp; vbTab _
                    &amp; vbTab &amp; "contact: " &amp; c.contact_name)
 Next c
End Using

関連項目

サンプル: LINQ クエリの作成
サンプル: 複雑な LINQ クエリ
LINQ (.NET 統合言語クエリ) を使用してクエリを作成する
LINQ クエリでの遅延バインド エンティティ クラスの使用
ブログ: LINQPad 4 Driver for Dynamics CRM REST/Web API are available on CodePlex (CodePlex で使用できる Dynamics CRM REST/Web API 用の LINQPad 4 ドライバー)

Microsoft Dynamics 365

© 2017 Microsoft. All rights reserved. 著作権