LINQ を使用したクエリの構築
Microsoft Dataverse の .NET 統合言語クエリ (LINQ) のクエリ プロバイダーでは、標準の LINQ 構文を使用します。 LINQ クエリを作成するには、最初に関連するテーブルの種類およびそれらの関係を特定します。 その後、データ ソースや他のクエリ パラメーターを指定します。
from
句は、単一の "ルート" テーブルを返すために使用されます。 クエリ プロバイダーは単一テーブルの種類の行のみ返すことができます。 orderby
句および select
句は、このルート テーブルを参照する必要があります。 "ルート" テーブルと関係を持つ行を追加するには join
句を使用します。
LINQ 演算子
すべての LINQ クエリ式は類似した形式を持っています。 次のセクションでは、Dataverse LINQ クエリ プロバイダーを使用する際の最も一般的な LINQ クエリ式を示します。
from
生成されたサービス コンテキストで事前バインドを行う場合、生成されたコンテキスト内で IQueryable
テーブル セット (AccountSet
など) を使用します。
生成されたコンテキストを使用しない場合、サービス コンテキスト オブジェクトの CreateQuery
メソッドを使用して、Dataverse テーブル行にアクセスできます。
例:
生成されたサービス コンテキストを使用する場合
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
句には 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 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 関数の Contains 、StartsWith 、EndsWith 、および Equals をサポートします。 |
groupBy |
サポートされていません。 FetchXML LINQクエリ プロバイダーでは使用できないグループ化オプションをサポートします。 詳細情報: FetchXml を使用してデータを集約するFetchXml を使用してデータを集約する |
orderBy |
テーブル列 (Contact.FullName など) による並べ替えがサポートされています。 |
select |
匿名型、コンストラクター、初期化子がサポートされています。 |
last |
last 演算子はサポートされていません。 |
skip およびtake |
サーバー側のページングを使用する skip および take はサポートされています。 skip の値は take の値以上である必要があります。 |
aggregate |
サポートされていません。 FetchXML LINQクエリ プロバイダーでは使用できない集計オプションをサポートします。 詳細情報: FetchXML を使用してデータを集計する |
複数のテーブルをフィルタリングする
Dataverse で、複雑な .NET 統合言語クエリ (LINQ) クエリを作成できます。 フィルター句を指定して複数の 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);
}
}
参照
LINQ を使用してクエリを作成する (.NET 統合言語クエリ)
LINQ クエリでの遅延バインド エンティティ クラスを使用する
LINQ でテーブル列を使用して結果を並べ替える
LINQ による大量の結果セットのページング
サンプル: LINQ を使用したデータのクエリ
Microsoft Dataverse で、OrganizationServiceContext を使用した LINQ クエリの例
注意
ドキュメントの言語設定についてお聞かせください。 簡単な調査を行います。 (この調査は英語です)
この調査には約 7 分かかります。 個人データは収集されません (プライバシー ステートメント)。