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

时间:2016-07-15 12:52:46

标签: c# entity-framework linq

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

我尝试过以下代码(类似),但是尽管查询返回数据,但set的{​​{1}}是一个空列表。我假设Linq创建了一个新的MyModel实例,然后添加记录集中的记录。

是否可以在完全填充MyList之后触发value ,但是在MyModel的范围内(即在doSomething()之后不添加后续调用)?

context.SomeEntities.Select(...)

1 个答案:

答案 0 :(得分:1)

你的两个问题的答案是&#34;是的。&#34;以下对我有用:

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

}