我正在加入4个表(Productos,ProductosFotos,Marca,Categoria)以通过CategoriaId查找产品。 ProductoFotos表包含3张图片,但我只需要显示其中的1张图片。我需要做什么,不要为每张图片重复结果。
这是我的代码:
var productoInCategoriaInDb = _productoRepository.GetAll()
.Where(x => x.Publicado == true && x.CategoriaId == id)
.GroupJoin(
_productoFotoRepository.GetAll(), <-- here take only one image
p => p.ProductoId,
pf => pf.ProductoId,
(p, pf) => new { p, pf })
.SelectMany(
p => p.pf.DefaultIfEmpty(),
(p, pf) => new { p.p, pf })
.GroupJoin(
_marcaRepository.GetAll(),
ppf => ppf.p.MarcaId,
pm => pm.MarcaId,
(ppf, pm) => new { ppf, pm })
.SelectMany(
ppfpm => ppfpm.pm.DefaultIfEmpty(),
(ppfpm, pm) => new { ppfpm.ppf, pm })
.GroupJoin(
_categoriaRepository.GetAll(),
ppfpm => ppfpm.ppf.p.CategoriaId,
pc => pc.CategoriaId,
(ppfpm, pc) => new { ppfpm, pc })
.SelectMany(
ppfpmpc => ppfpmpc.pc.DefaultIfEmpty(),
(ppfpmpc, pc) => new ProductoBuscarViewModel
{
Producto = ppfpmpc.ppfpm.ppf.p,
ProductoFoto = ppfpmpc.ppfpm.ppf.pf,
Marca = ppfpmpc.ppfpm.pm,
Categoria = pc
}
);
更新
答案 0 :(得分:0)
这将有效:
var productoInCategoriaInDb = from prod in _productoRepository.GetAll()
join imag in _productoFotoRepository.GetAll()
on p.ProductoId equals imag.ProductoId into imags
from imag in imags.DefaultIfEmpty()
join marca in _marcaRepository.GetAll()
on prod.MarcaId equals marca.MarcaId into marcas
from marca in marcas.DefaultIfEmpty()
join cat in _categoriaRepository.GetAll()
on cat.CategoriaId equals prod.CategoriaId into cats
from cat in cats.DefaultIfEmpty()
group new { prod, imag, marca, cat } by new { P = prod, M = marca, C = cat } into prodGroup
select new ProductoBuscarViewModel(){
Producto = prodGroup.Key.P
ProductoFoto = prodGroup.FirstOfDefault().imag
Marca = prodGroup.Key.M
Categoria = prodGroup.Key.C
}
这将生成一个带顶部(1)的子选择,以获得具有相同产品的所有图像。我在LinqPad中用类似的实体证明了这一点。我通常在ProductoFoto实体中放置一个字段来设置Proveedor的“默认”图像。然后过滤_productoFotoRepository.GetAll()以仅获取默认图像。有了它你不需要调用组,查询将执行得更快。