Linq to Entities查询说明

时间:2013-06-25 21:47:17

标签: linq entities

有什么办法可以让Linq以实体查询方式(更好)并理解我的所作所为

首先,我可以在第一部分string.jon()中使用(select(p => new {...)吗?

其次,为什么我需要第一个选择以.ToList()结束才能使string.join()生效?

表关系如下:

enter image description here

以下是代码:

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

1 个答案:

答案 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的其他工作(或者效率不高)。