使用subselect - LINQ to entities填充POJO中的列表

时间:2011-11-14 12:48:07

标签: 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属性?

2 个答案:

答案 0 :(得分:2)

根据您的代码和说明,如果尝试使用MyRelations,则不会加载。然后你在查询期间尝试populeta MyRelationsIds。有两种方法可以解决这个问题。我个人更喜欢第一个:

  1. 将您的MyRelations媒体资源替换为public virtual List<Relation> MyRelations。虚拟是一种约定,在此之后EF将创建一个代理,它将充当惰性属性。即它会在您触摸后立即加载。
  2. 另一种方法是使用预先加载,使用它你不必更改签名。 只需使用Include方法,告诉EF您想要加载哪些道具。 请参阅.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();
     }
    

答案 1 :(得分:0)

您是否尝试从行中删除“.ToList()”:

MyRelationIds = t.MyRelations.Select(mr => mr.MyRelationId).ToList()

所以它看起来像这样:

MyRelationIds = t.MyRelations.Select(mr => mr.MyRelationId)