List 和实体框架 6 linq 查询的属性访问器

本文关键字:查询 linq 属性 访问 框架 实体 List | 更新日期: 2023-09-27 17:57:17

是否可以

让 (EF6) Linq select 语句实例化类,以便使用 Linq 语句返回的值触发属性的set访问器?

我已经尝试了与下面的代码(类似),但是尽管查询返回数据,但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 });

List<T> 和实体框架 6 linq 查询的属性访问器

这两个问题的答案都是"是"。以下内容对我有用:

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]);
    }
}

}