2016-07-15 45 views
1

是否有可能讓(EF6)Linq select語句實例化一個類,從而使用從Linq語句返回的值觸發屬性的set訪問器?列表<T>的屬性訪問器和實體框架6 linq查詢

我試過以下代碼(類似),但是儘管查詢返回數據,setvalue是一個空列表。我假設Linq創建一個MyModel的新實例,然後添加記錄集中的記錄。

是否有可能觸發doSomething() MYLIST是完全填充,但是從爲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

我不認爲這與實體框架可以作爲選擇需要一個表達>而不是函數求<>。 'CS0834帶有語句正文的lambda表達式無法轉換爲表達式樹結構' – AndrewP

+1

您是對的。我在select語句之前添加了AsEnumerable方法,以避免上面提到的錯誤。 – bwyn

+0

謝謝,這對我來說非常有用! – AndrewP