有什么办法可以让Linq以实体查询方式(更好)并理解我的所作所为
首先,我可以在第一部分string.jon()
中使用(select(p => new {...)
吗?
其次,为什么我需要第一个选择以.ToList()
结束才能使string.join()
生效?
表关系如下:
以下是代码:
Productos.Select(p => new {
Id = p.Id,
Code = p.CodigoProd,
Name = p.Nombre,
Cant = p.Inventario.Sum(i => i.Cantidad),
Pric = p.Inventario.OrderBy(i => i.Precio).Select (i => i.Precio).FirstOrDefault(),
cate = p.ProductosXCategoria.Select(pc => pc.CategoriasdeProducto.Nombre)
}).Where (p => p.Cant != null).ToList()
.Select (r => new {
r.Id, r.Code, r.Cant, r.Name, r.Pric, Categ = string.Join("-",r.cate)
})
结果就是这个(这是我期望的结果):
IEnumerable<> (17 items)
**Id-- Code-- Cant-- Name-- Pric-- Categ**
1-- AXI-- 30-- Pepsi-- 10-- Granos
3-- ASI-- 38-- Carne blanca-- 12-- Granos-Limpieza
答案 0 :(得分:0)
查询对我来说很好。
您无法将string.Join
方法移动到第一个Select
的原因是LINQ-to-Entities最终必须能够转换为SQL。 string.Join
没有直接转换为SQL,因此它不知道如何将LINQ查询转换为它。首先调用ToList()
,将第一个Select
的结果带入内存,后续Select
与Linq-to-Objects一起使用。由于Linq-to-Objects不需要转换为SQL,因此它可以直接对内存中第一个查询的结果进行操作。
通常,您希望在<{em> ToList()
调用之前(例如过滤,排序,平均,分组等)放置最好留给SQL 的所有内容,然后离开在将结果带入本地内存之后,无法转换为SQL的其他工作(或者效率不高)。