次の方法で共有


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 関数の ContainsStartsWithEndsWith、および 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 分かかります。 個人データは収集されません (プライバシー ステートメント)。