2013-06-25 4 views
0

Можно ли каким-либо образом сделать этот Linq объектам запрос другим способом (лучше) и понять, что я сделал?Linq to Entities Объяснение запроса

Во-первых, могу ли я иметь 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 

ответ

0

Запрос выглядит хорошо для меня.

Причина, по которой вы не можете перенести метод string.Join в первый Select, заключается в том, что LINQ-to-Entities в конечном итоге должны быть способны перевести на SQL. string.Join не имеет прямого перевода на SQL, поэтому он не знает, как перевести ваш запрос LINQ на него. Сначала позвонив ToList(), вы принесете результаты первого Select в память, где последующий Select работает с Linq-to-Objects. Поскольку Linq-to-Objects не нужно переводить на SQL, он может напрямую работать с результатами первого запроса в памяти.

Вообще, вы хотели бы положить все, что было бы лучше оставить SQL перед темToList() вызова (например, как фильтрация, сортировка, усреднение, группировка и т.д.), а также оставить дополнительные работы, которые не могут быть переведены к SQL (или не так эффективен для этого) после того, как результаты были внесены в локальную память.

+0

Я действительно ценю ваше время, чтобы ответить на этот вопрос. Я не мог быть более счастлив получить поддержку в моем первом вопросе. Спасибо много из Гондураса. Я не могу голосовать, он говорит 15 репутации, но спасибо. –