2016-10-14 6 views
1

以下に示すように6つのテーブルがあります。 Application_nameEnvironment_name、およびStatusに基づいてデータを取得しようとしています。Entity Frameworkコアラムダ式は4つのテーブルとフィルタを結合します。

ステータステーブル:

Id, Name 

アプリケーションテーブル:

Id, Name 

サーバーテーブル:

Id, ServerName, Status 
Id, Name 

ResourceGroupテーブル:

Id, Name, Application_Id, Environment_Id 

ServersResourceGroup:

Id, Server_Id, Resource_Id 

私がやろうとしていますどのようなすべての必要とテーブルと使用に参加している表はの環境データをフィルタリングする場所ここ、Environment_name、およびStatus

Application_nameをフィルタリングすることにより、バック、すべてのデータを返しませんが、私は何の道の近くにEnvironment_nameStatusによって追加のフィルタを追加することにより、要件を超える満たすためにしていた、私が建てられ、私のクエリです:(

そこで、以下ここでApplication_name

public IEnumerable<ResourceGroup> GetAllServersByApplication(string application_name, string environment_name, string status) 
{ 
    var query = _context.ResourceGroup 
      .Include(a => a.Application) 
      .Include(t => t.Type) 
      .Include(e => e.ServersGroup).ThenInclude(e => e.Environment) 
      .Include(s => s.ServersGroup).ThenInclude(s => s.Server) 
      .Include(s => s.ServersGroup).ThenInclude(s => s.Server).ThenInclude(s => s.Status) 
      .Where(a => a.Application.Name == application_name) 
      .ToList(); 

    return query; 
} 

ですべてのデータを返すクエリは、私はそれがすべての3つのフィルタに基づいてフィルタリングします記述しようとしていますクエリです:

public IEnumerable<ResourceGroup> GetAllServersByApplication(string application_name, string environment_name, string status) 
    { 
     var query = _context.ResourceGroup 
      .Include(a => a.Application) 
      .Include(t => t.Type) 
      .Include(e => e.ServersGroup).ThenInclude(e => e.Environment) 
      .Include(s => s.ServersGroup).ThenInclude(s => s.Server) 
      .Include(s => s.ServersGroup).ThenInclude(s => s.Server).ThenInclude(s => s.Status) 
      .Where(a => a.Application.Name == application_name) 
      .Select(e => e.ServersGroup.Where(s => s.Environment.Name == environment_name && s.Server.Status.Name == status) 
      .ToList(); 

     return query; 
    } 

return queryの下に赤い線が表示されます。下の画像を参照してください: enter image description here

私は何をしようとしているラムダクエリを書くための簡単な方法はありますか?

本当にありがとうございます。あなたが今、あなたのメソッドシグネチャでは異なっているServersGroupのコレクションを返しているので、:)

おかげで、

レイ

+0

ちょっとしたアドバイス:「選択」しない場合は、すべてにInclude()を使用する必要はありません。つまり、アプリケーションでデータを必要とせず、それを含まない場合です。 'Where'はインクルードなしで正常に動作します。 –

+0

あなたのお問い合わせの問題点を教えてください。 – Sampath

+0

@Sampath - 私は自分の質問を更新しました。 – Ray

答えて

1

ありますエラーです。これは、Select句を追加し、からプロパティServersGroupを選択したためです。フィルタリングはWhere句で行われます。以下のコードを更新し、SelectのフィルタをWhereに移動しました。ここでは、どこにboolean句があると期待してAnyに変更されましたか?

ResourceGroupに特定のServersGroupを含めるつもりだった場合は、それらを結合または外部結合ステートメントでフィルタリングする必要があります。

また、おそらくどこにでもインクルードする必要はありません。インクルードは熱心なローディングに使用され、関連付けられた関係を取得するためにデータベースに1回のラウンドトリップが必要になります。これらの関連するすべてのプロパティにアクセスする予定がない場合は、それらのプロパティを含めないでください。

私はあなたの関係が流暢なマッピングファイルかモデルの属性を使って正しくマップされていると仮定します。

public IEnumerable<ResourceGroup> GetAllServersByApplication(string application_name, string environment_name, string status) 
{ 
    var query = _context.ResourceGroup 
     .Include(a => a.Application) 
     .Include(t => t.Type) 
     .Include(e => e.ServersGroup).ThenInclude(e => e.Environment) 
     .Include(s => s.ServersGroup).ThenInclude(s => s.Server) 
     .Include(s => s.ServersGroup).ThenInclude(s => s.Server).ThenInclude(s => s.Status) 
     .Where(a => a.Application.Name == application_name && a.ServersGroup.Any(s => s.Environment.Name == environment_name && s.Server.Status.Name == status)) 
     .ToList(); 

    return query; 
} 
+1

私は、各テーブルの 'Name'プロパティにアクセスするためにincludeからプロパティにアクセスする予定です。これらのプロパティを 'ResourceGroup'に追加できるかどうかを試してみます。どうもありがとうございます。あなたの質問は、私が間違っていたことを理解するのに役立ちました。 :) – Ray