我在我的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();
}
}
您正在尝试返回一个匿名对象集合。
你需要在你的select
到Pedidos
中命名你的对象:
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();
}
}