c# - 使用子选择填充 POCO 中的列表 - LINQ to entities

标签 c# linq-to-entities poco

我正在尝试从我的数据库中创建一个 POCO 列表。 POCO 类有一个 List<int>我想像这样填充的属性:

public List<Pocos.MyTable> GetData()
{
    using (EFContext c = new EFContext())
    {
        var query = from t in c.MyTable
                    select new Pocos.MyTable()
                    {
                        MyId = t.MyId,
                        MyField = t.MyField,
                        MyRelationIds = t.MyRelations.Select(mr => mr.MyRelationId).ToList()
                    };

        return query.ToList();
    }
}

不幸的是,我在 ToList() 上收到“此方法无法转换为存储表达式”在查询中。我可以在这里很好地做到这一点,还是我必须做很多后续查询来填充 MyRelationIds属性(property)?

最佳答案

根据我得到的代码和描述,如果尝试只使用 MyRelations , 它没有加载。然后你尝试 populeta MyRelationsIds在查询期间。有两种方法可以解决这个问题。我个人更喜欢第一个:

  1. 替换您的 MyRelations属性(property) public virtual List<Relation> MyRelations . Virtual 是一种约定,之后 EF 将创建一个代理,该代理将充当惰性属性。 IE。一触即载。
  2. 另一种方法是使用预先加载,您不必更改签名。 只需使用 Include方法,告诉 EF 你想急切加载哪些 Prop 。 看到.Include("MyRelations")它告诉我,必须在此查询期间加载 MyRelations。所以你可以稍后使用它们。如果你只想拥有关系的 id,那么你应该首先具体化你的对象然后进行映射(注意 AsEnumerable() )

    using (EFContext c = new EFContext())
    {
        var query = from t in c.MyTable.Include("MyRelations").AsEnumerable()
        select new Pocos.MyTable()
        {
            MyId = t.MyId,
            MyField = t.MyField,
            MyRelationIds = t.MyRelations.Select(mr => mr.MyRelationId).ToList()
        };
    
        return query.ToList();
     }
    

关于c# - 使用子选择填充 POCO 中的列表 - LINQ to entities,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8121815/

相关文章:

c# - 将存储过程映射到实体对象及其子对象

c# - 为什么要使用 Using block 连接到 EntityFramework 模型?

sql - MVVM 和 Entity Framework - 什么引发事件?

entity-framework - 如何为Entity Framework 5自定义复数

c# - 控制台图表绘制

c# - 如何在不实际单击按钮的情况下触发 Button Click 事件?

c# - 我如何过滤掉 NaN 值并将其替换为另一个值

c# - 通过字符串 na C# 实例化子类

c# - 使用 Table Per Hierarchy 继承在 LINQ to Entities 查询中转换为派生类型

.net - 使用具有 POCO 支持的 Entity Framework 4 实现 propertychanged 事件的最罕见和最有效的方法是什么?