我正在尝试从我的数据库中创建一个 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
在查询期间。有两种方法可以解决这个问题。我个人更喜欢第一个:
- 替换您的
MyRelations
属性(property)public virtual List<Relation> MyRelations
. Virtual 是一种约定,之后 EF 将创建一个代理,该代理将充当惰性属性。 IE。一触即载。 另一种方法是使用预先加载,您不必更改签名。 只需使用
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/