2016-03-22 22 views
0

私はC#WPFアプリケーションでEntity Framework 6.0を使用しています。私は、Employeeエンティティを検索するには、このクエリを持っている:チェックボックスに基づくLINQ結合

var query = Context.Employees.AsQueryable(); 
switch (selectedColumnValue) 
{ 
    case "lastName": 
     query = query.Where(q => q.lastName == SearchValue); 
     break; 
    case "employeeID": 
     query = query.Where(q => q.personnelID == SearchValue); 
     break; 
    case "securityID": 
     query = query.Where(q => q.securityID == SearchValue); 
     break; 
    default: 
     return; 
} 

親エンティティEmployeeは、従業員が不在、またはアーカイブされたの休暇に、非アクティブであるかどうかを示すためにEmployeeStatusエンティティに、いくつかの子行を有することができます。 Employeeエンティティの主キーはemployeeIDであり、外部キーはEmployeeStatusです。ここで

は、Employeeエンティティの列です:ユーザーがチェックボックスをクリックすると

public int employeeID { get; set; } 
public string personnelID { get; set; } 
public string securityID { get; set; } 
public string firstName { get; set; } 
public string middleName { get; set; } 
public string lastName { get; set; } 
public string suffix { get; set; } 
public string job { get; set; } 
public string organizationalUnit { get; set; } 
public string costCenter { get; set; } 
public string notes { get; set; } 
public System.DateTime createdDate { get; set; }  

そして、ここではEmployeeStatusエンティティの列

public int employeeStatusID { get; set; } 
public int employeeID { get; set; } 
public int validEmployeeStatusID { get; set; } 
public Nullable<System.DateTime> exitDate { get; set; } 
public System.DateTime createdDate { get; set; } 

だ「アーカイブの従業員が含まれていますか?」検索中にEmployeeStatusへの参加を行い、EmployeeStatusvalidEmployeeStatusID5(アーカイブ済み)という条件を追加する必要があります。 LINQでこれをどうやってやりますか?

更新:私は、LINQのは、このようなIF文の中で上記switch文の後に参加を追加する必要があります。

if (IncludeArchived) 
{ 
    // Add to Linq query here using method syntax 
} 

だからLINQのステートメントは、メソッドの構文を使用する必要があります。

+0

あなたは '..Join()関数または.Concat()'を使用できませんでしたか? – MethodMan

+0

ありがとう、@MethodMan。 '.Join()'は 'Where()'句を使ってビルドされた後、クエリの最後に移動するだけでしょうか? – Alex

+0

EFを使用している場合は、EmployeeStatusの従業員のナビゲーションプロパティが必要です。 – Shoe

答えて

1

このクエリについてはどうなりますか?

query = (from empl in query 
     join status in Context.Status on empl.employeeID equals status.employeeID 
     where status.employeeStatusID == 5 
     select empl).Distinct(); 

それとも、チェーンが実行できます。

query = query.Join(Context.Status, x => x.employeeID, x => x.employeeID, (a, b) => new { a, b }) 
    .Where(x => x.b.employeeStatusID == 5).Select(x => x.a).Distinct(); 
+0

ありがとう、@ SlavaUtesinov。私の質問では、クエリを構築するためにメソッド構文を使用しているので、サンプルコードを使用することはできません。 'switch'ステートメントの後にjoinを' if'で追加する必要があります。上記の私の更新を見てください。 – Alex

+1

私は私の答えを更新しました、それを確認してください。それはあなたが望むものですか? –

+0

ありがとう、@ SlavaUtesinov。質問: '(a、b)'セクションは何をしていますか?それはどのように機能するのですか?申し訳ありませんが、私はLinqの新しいです。 – Alex

1

実際にあなたがswitch文の後にそれを追加するを必要としないありません。

現在の実装では、すべての従業員(アーカイブされた従業員も含む)を含めています。したがって、チェックボックスがオンになっていない場合はアーカイブされたものを除外するように実際に作成する必要があります。

注:エンティティのナビゲーションプロパティがあるとします。

var query = Context.Employees.AsQueryable(); 

if (!IncludeArchived) 
{ 
    query = query.Where(e => e.Status == null || e.Status.employeeStatusId != 5); 
} 

switch (selectedColumnValue) 
{ 
    // ... 
} 
+0

ありがとう、@ JanneMatikainen。一部の従業員だけが、非アクティブ、休暇、またはアーカイブされているEmployeeStatusテーブルのレコードを持ちます。そして、Visual Studioは、EFがデータベースの第1世代のモデルを実行したときにナビゲーションプロパティを自動的に生成しました。 – Alex

+0

さて、ステータスがnullであるか、ステータスのIDが5であるかどうかを確認してください。これを反映するように答えを編集しました。 –

+0

おそらく私はnavプロパティを持っていないかもしれません。それは 'e.Status.employeeStatusId!= 5'を使うことはできません。 「ICollection 」に「employeeStatusID」の定義が含まれていないと言います – Alex

関連する問題