LINQ を使用したクエリの構築
公開日: 2016年11月
対象: Dynamics CRM 2015
.NET 統合言語クエリ (LINQ) の Microsoft Dynamics CRM 2015 および Microsoft Dynamics CRM Online 2015 更新プログラム クエリ プロバイダーでは、標準の LINQ 構文が使用されます。 LINQ クエリを作成するには、最初に関連するエンティティの種類およびそれらの関係を特定します。 その後、データ ソースや他のクエリ パラメーターを指定します。
from 句は、単一の "ルート" エンティティに戻るために使用されます。 クエリ プロバイダーは 1 種類のエンティティにのみ戻ることができます。orderby 句および select 句は、このルート エンティティを参照する必要があります。 "ルート" エンティティとの関係を追加するには join 句を使用します。
このトピックの内容
LINQ 演算子
LINQ の制限
複数のエンティティのフィルター処理
LINQ 演算子
すべての LINQ クエリ式は類似した形式を持っています。 次の表で、Microsoft Dynamics 365 LINQ クエリ プロバイダーを使用する際の最も一般的な LINQ クエリ式を示します。
LINQ 演算子 |
説明 |
例 |
---|---|---|
データ ソースの取得 (from 句) |
生成されたサービス コンテキストで事前バインドを行う場合、生成されたコンテキスト内で IQueryable エンティティ セット (AccountSet など) を使用します。 生成されたコンテキストを使用しない場合、組織サービス コンテキスト オブジェクトの CreateQuery メソッドを使用して Microsoft Dynamics 365 エンティティにアクセスできます。 |
生成されたサービス コンテキストを使用する場合
CreateQuery メソッドを使用する場合
|
join 句 |
join 句は内部結合を表します。 共通の属性値を持つ 2 つ以上のエンティティを操作する場合に使用します。 |
|
フィルタリング (where 句) |
where 句では、一般にブール式を使用して結果にフィルターを適用します。 フィルターは、ソース シーケンスから除外する要素を指定します。 各 where 句には 1 種類のエンティティに対する条件のみを含めることができます。 複数のエンティティが関係する複合条件は無効です。 このような場合は、各エンティティを個別の where 句でフィルタリングする必要があります。 |
|
orderby |
orderby 演算子は、返されたクエリ属性を指定された順番に並べます。 |
|
select 句 |
select 句は、返されるデータのフォームを指定します。 この句は、クエリ式の結果に基づいた列セットを作成します。 作業に使用する新しいオブジェクトのインスタンスを定義することもできます。select 句を使用して新しく作成されたオブジェクトは、サーバー上ではなくローカルでインスタンスとして作成されます。 |
|
LINQ の制限
LINQ クエリ プロバイダーは LINQ 演算子のサブセットをサポートします。 LINQ で表現できるすべての条件がサポートされているわけではありません。 次の表に、基本的な LINQ 演算子の制限の一部を示します。
LINQ 演算子 |
制限 |
---|---|
join |
内部結合を表します。 外部結合は実行できません。 |
from |
1 クエリにつき 1 つの from 句をサポートします。 |
where |
句の左側は属性名、右側は値である必要があります。 左側に定数を設定することはできません。 句の両側を定数にすることはできません。 String 関数の Contains、StartsWith、EndsWith、および 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 CRM 2015 では、複数の Microsoft Dynamics CRM Online クエリを作成できます。 フィルター句を指定して複数の 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: " & c.account_name & vbTab & vbTab _
& vbTab & "contact: " & c.contact_name)
Next c
End Using
関連項目
サンプル: LINQ クエリの作成
サンプル: 複雑な LINQ クエリ
LINQ (.NET 統合言語クエリ) を使用してクエリを作成する
LINQ クエリでの遅延バインド エンティティ クラスの使用
ブログ: MS Dynamics CRM 2011 用の LINQPad プラグイン
© 2017 Microsoft. All rights reserved. 著作権