我的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)
我在这里错过了一些东西?谢谢!
答案 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)
您正在尝试返回匿名对象的集合。
您需要在select
至Pedidos
:
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();
}
}