无法将 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被定义为POCOs数据库类所以这个工作很好:

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)

我是不是错过了什么?谢谢!

您没有返回您所说的类型。您正在返回一个匿名类型。通过投影到已知类型来修复这个问题:

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

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

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

我想你在找这个:

select Pedidos;

而不是:

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

如果这是linq -to- entities,你不能投影到实体类,所以不能工作:

select new Pedidos { ... } 
但是,您可以投影到一个新的类,如
select new PedidosCustomClass { ... } 

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

您正在创建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();
    }
}        

或者您将不得不自己进行映射/强制转换。像这样可以工作:

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

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

你需要在你的selectPedidos中命名你的对象:

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

你得到的原始错误的原因已经由@Selman22解释。但是解决方案会导致另一个错误,因为您无法在linq到实体查询中创建映射实体(您的POCOs 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
                                });
    }
}

为什么要实例化新的Pedidos?试着这样做:

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

相关内容

  • 没有找到相关文章

最新更新