2016-12-08 5 views
0

以下のコードでは、私はEmployeeオブジェクトのコレクションを持っています。従業員がInOrgであるかどうかを確認する必要があります。そのためには、InOrgCatalogテーブルとの左結合を行い、匿名オブジェクトを返します。私はすでにInOrgプロパティ をEmployeeオブジェクトに持っているので、匿名オブジェクトを返す代わりに、InOrgプロパティが更新されたEmployeeオブジェクトを返したいと思います。私はそれを達成するためにクエリで何をしなければならないのですか?LINQ左外部結合の実行中に選択したオブジェクトを更新する

List<Employee> employees = new List<Employee> 
       { 
        new Employee { EmployeeId = 1, EmployeeName = "Aaron" , Alias = "AWERAS", InOrg = false}, 
        new Employee { EmployeeId = 2, EmployeeName = "asdfsdf" , Alias = "HJKHJK", InOrg = false}, 
        new Employee { EmployeeId = 3, EmployeeName = "qwerwe" , Alias = "NMUIYUI", InOrg = false}, 
        new Employee { EmployeeId = 4, EmployeeName = "zcvcx" , Alias = "PIOUKJ", InOrg = false}, 
       }; 

using (var context = new MyDbContext()) 
     { 
      var result = (from employee in employees 
          join catalog in context.InOrgCatalogs on new { Alias = employee.Alias, Active = true } equals 
          new { Alias = catalog.Alias, Active = catalog.Active } 
          into ps 
          from p in ps.DefaultIfEmpty() 
          select new { Employee = employee , InOrg = !(p == null)}).ToList();     
     } 
+0

LINQの_querying_、ない_updating_ためのものです。アイテムをそのまま取得してループスルーするか、 'Employee'オブジェクトを更新するか、_new_' Employee'オブジェクトに投影して、プロパティ値のすべてをコピーすることができます。 –

+0

私はdbの値を照会しようとしていて、dbの値を更新しようとしていません。新しい従業員オブジェクトを再作成せずに解決策が役立つでしょう。ありがとうございました! –

答えて

0

匿名オブジェクトではなく新しいEmployeeeオブジェクトを選択する必要があります。必要に応じてその後、プロパティを更新することができます。

using (var context = new MyDbContext()) 
{ 
    var result = (from Employee employee in employees 
        join catalog in context.InOrgCatalogs on new { Alias = employee.Alias, Active = true } equals 
        new { Alias = catalog.Alias, Active = catalog.Active } 
        into ps 
        from p in ps.DefaultIfEmpty() 
        select new Employee { EmployeeId = employee.EmployeeId,EmployeeName = employee.EmployeeName, Alias = employee.Alias, InOrg = !(p == null) }).ToList(); 
} 
+0

ありがとうございます。オブジェクトに複数のプロパティがあると苦しいでしょう。将来、新しいプロパティを追加する場合は、コードのこの部分が変更を反映するように変更する必要があります。より良いオプションはありますか? –

+0

既存のEmployeeインスタンスを受け入れるコンストラクタと、変更するプロパティを示す文字列、値のペアを作成できます。シンプルなスイッチケースブロックがそれを行います。 – tinstaafl

0

また、あなたはletキーワードと二重の割り当てでトリックを使用することができます。

using (var context = new MyDbContext()) 
{ 
    var result = (from employee in employees 
        join catalog in context.InOrgCatalogs 
        on new { Alias = employee.Alias, Active = true } equals 
        new { Alias = catalog.Alias, Active = catalog.Active } into ps 
        from p in ps.DefaultIfEmpty() 
        let temp = employee.InOrg = (p != null)//it will do the work 
        select employee).ToList();     
} 
関連する問題