2016-07-15 9 views
1

Linqステートメントから返された値でプロパティのsetアクセサがトリガされるように、(EF6)Linq selectステートメントでクラスをインスタンス化できますか?List <T>のプロパティアクセサー、エンティティフレームワーク6 linqクエリ

私は以下のコードに似ていますが、データを返すクエリにもかかわらず、setvalueは空のリストです。私はLinqがMyModelの新しいインスタンスを作成し、レコードセットからレコードを追加すると仮定しています。

は MYLIST後doSomething()を完全に人口が、mymodelというの範囲内から(すなわちcontext.SomeEntities.Select(...)後に後続の呼び出しを添加しない)をトリガすることはできますか?

public class MyModel{ 
    private List<string> _myList; 
    public List<string> MyList { 
    get { return _myList; } 
    set { _myList = value; doSomething(); } 
    } 
    private void doSomething() {...} 
} 

.. 
context.SomeEntities.Select(x => new MyModel { MyList = x.YourList }); 

答えて

1

両方の質問に対する回答が「はい」です。私のために働い以下:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Context context = new Context(); 
     List<MyModel> myModelsList = context.Products.Include("Names").AsEnumerable().Select(x => 
     { 
      MyModel model = new MyModel(); 
      model.MyList = x.Names.Select(pn => pn.Name).ToList(); 
      return model; 
     }).ToList(); 
    } 

    static void CreateAndSeedDatabase() 
    { 
     Context context = new Context(); 
     Product product1 = new Product() { Names = new List<ProductName> { new ProductName { Name = "1" } } }; 
     Product product2 = new Product() { Names = new List<ProductName> { new ProductName { Name = "2" } } }; 
     context.Products.Add(product1); 
     context.Products.Add(product2); 
     context.SaveChanges(); 
    } 
} 

public class Context : DbContext 
{ 
    public Context() 
    { 
     Database.SetInitializer<Context>(new CreateDatabaseIfNotExists<Context>()); 
     Database.Initialize(true); 
    } 

    public DbSet<Product> Products { get; set; } 
    public DbSet<ProductName> ProductNames { get; set; } 
} 

public class Product 
{ 
    public int ProductId { get; set; } 
    public List<ProductName> Names { get; set; } 
} 

public class ProductName 
{ 
    public int ProductNameId { get; set; } 
    public string Name { get; set; } 
} 

public class MyModel 
{ 
    private List<string> _myList; 
    public List<string> MyList 
    { 
     get { return _myList; } 
     set { _myList = value; doSomething(); } 
    } 
    private void doSomething() 
    { 
     Console.WriteLine(_myList[0]); 
    } 
} 

}

+0

私は選択式を取る>とないのFunc <>としてEntity Frameworkのに動作するとは思いません。 'CS0834文の本文を持つラムダ式を式ツリーに変換できません。 ' – AndrewP

+1

あなたは正しいです。上記のエラーを避けるために、Select文の前にAsEnumerableメソッドを追加しました。 – bwyn

+0

ありがとう、これは私にとって非常に便利です! – AndrewP

関連する問題