无法将Linq转换为IEnumerable

时间:2014-03-20 14:36:59

标签: .net linq ienumerable

我的DAL课上有这个方法:

public IEnumerable<Pedidos> Pedidos_Listar()
    {
        using (var context = new OhmioEntities())
        {              
            var _ped = 
                from Pedidos in context.Pedidos
                where Pedidos.ID_Cliente == 1
                select new {Pedidos.ID_Pedido, Pedidos.Fecha, Pedidos.Clientes};
            return _ped.ToList();
        }
    }        

VS给出了这个错误:

    Error   3   No se puede convertir implícitamente el 
tipo 'System.Collections.Generic.List<AnonymousType#1>' 
en 'System.Collections.Generic.IEnumerable<Ohmio.ModelLayer.Pedidos>'. 
Ya existe una conversión explícita (compruebe si le falta una conversión)

我在这里做错了什么?谢谢

修改 更多信息:Pedidos被定义为POCO db类 所以这项工作很好:

public IEnumerable<Pedidos> Pedidos_Listar()
        {
            using (var context = new OhmioEntities())
            {
                return context.Pedidos.ToList();
            }
        }       

但是我需要使用linq来选择一些字段和一个where子句。 当我按照建议尝试这个时:

public IEnumerable<Pedidos> Pedidos_Listar()
        {
            using (var context = new OhmioEntities())
            {              
                var _ped = 
                    from Pedidos in context.Pedidos
                    where Pedidos.ID_Cliente == 1
                    select new Pedidos {Pedidos.ID_Pedido, Pedidos.Fecha, Pedidos.Clientes};
                return _ped.ToList();
            }
        }        

我收到此错误:

    Can't inicialize type 'Ohmio.ModelLayer.Pedidos' with a colection inicializer because 
don't implement 'System.Collections.IEnumerable' (Manual translate)

我在这里错过了一些东西?谢谢!

8 个答案:

答案 0 :(得分:1)

您正在创建一个匿名对象列表。如果您想要一个强类型集合,请更改您的代码:

 var _ped = from p in context.Pedidos
            where p.ID_Cliente == 1
            select new Pedidos 
            {
                ID_Pedido = p.ID_Pedido, 
                Fecha = p.Fecha, 
                Clientes = p.Clientes
            };

答案 1 :(得分:1)

你没有回复你说的那种类型。你正在返回一个匿名类型。通过投射到已知类型来解决此问题:

public IEnumerable<Pedidos> Pedidos_Listar()
    {
        using (var context = new OhmioEntities())
        {              
            var _ped = 
                from Pedidos in context.Pedidos
                where Pedidos.ID_Cliente == 1
                select new Pedidos {Id = Pedidos.ID_Pedido, Fecha = Pedidos.Fecha, Clientes = Pedidos.Clientes};
            return _ped.ToList();
        }
    }  

或者,如果您不需要投影并直接返回EF模型:

public IEnumerable<Pedidos> Pedidos_Listar()
    {
        using (var context = new OhmioEntities())
        {              
            var _ped = 
                from Pedidos in context.Pedidos
                where Pedidos.ID_Cliente == 1
                select Pedidos;
            return _ped.ToList();
        }
    }  

或者简单地说:

public IEnumerable<Pedidos> Pedidos_Listar()
    {
        using (var context = new OhmioEntities())
        {              
            return context.Pedidos.Where(p => p.ID_Cliente == 1);
        }
    }

答案 2 :(得分:0)

我认为你正在寻找这个:

select Pedidos;

而不是:

select new {Pedidos.ID_Pedido, Pedidos.Fecha, Pedidos.Clientes};

如果这是Linq-to-entites,则您无法投放到实体类,因此不会工作:

select new Pedidos { ... } 

但是,你可以投射到像

这样的新类
select new PedidosCustomClass { ... } 

答案 3 :(得分:0)

您的select正在选择新的匿名类型,但您尝试将该匿名类型作为Pedidos的实例返回。您需要更改select以创建Pedidos的实例。

答案 4 :(得分:0)

您正在尝试返回匿名对象的集合。

您需要在selectPedidos

中为对象命名
select new Pedidos { ID_Pedido = Pedidos.Id_Pedido, 
                     Fecha     = Pedidos.Fecha, 
                     Clientes  = Pedidos.Clientes };

答案 5 :(得分:0)

您正在创建anonymous个对象的列表,然后尝试将其作为Pedidos的列表返回。编译器不知道如何进行转换。您可以将其更改为:

public IEnumerable<Pedidos> Pedidos_Listar()
{
    using (var context = new OhmioEntities())
    {              
        var _ped = 
            from Pedidos in context.Pedidos
            where Pedidos.ID_Cliente == 1
            select new Pedidos;
        return _ped.ToList();
    }
}        

或者你必须自己做maping / cast。这样的事情会起作用:

public IEnumerable<Pedidos> Pedidos_Listar()
{
    using (var context = new OhmioEntities())
    {              
        var _ped = 
            from P in context.Pedidos
            where P.ID_Cliente == 1
            select new Pedidos { ID_Pedido = P.ID_Pedido,
                                 Fecha = P.Fecha,
                                 Clientes = P.Clientes};
        return _ped.ToList();
    }
}        

答案 6 :(得分:0)

@ Selman22已解释原始错误的原因。但该解决方案会导致另一个错误,因为您无法在LINQ到实体查询中创建映射实体(您的 POCO db类)。要解决方法,请尝试在客户端初始化实体(在LINQ到实体查询之外):

public IEnumerable<Pedidos> Pedidos_Listar()
{
    using (var context = new OhmioEntities())
    {              
        var _ped = 
            (   
                from Pedidos in context.Pedidos
                where Pedidos.ID_Cliente == 1
                select new {Pedidos.ID_Pedido, Pedidos.Fecha, Pedidos.Clientes}
            ).ToList();
        return _ped.Select(o => new Pedidos 
                                {
                                    ID_Pedido = p.ID_Pedido, 
                                    Fecha = p.Fecha, 
                                    Clientes = p.Clientes
                                });
    }
}

答案 7 :(得分:0)

为什么要实例化新的Pedidos? 试试这个:

public IEnumerable<Pedidos> Pedidos_Listar()
{
    using (var context = new OhmioEntities())
    {              
        return context.Pedidos
            .Where(p => p.ID_Cliente == 1)
            .AsEnumerable();
    }
}