C#lambda表达式连接4个表的情况

时间:2017-05-12 19:15:24

标签: c# asp.net-mvc linq lambda

我正在加入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
                }
            );

更新

Relational contraints diagram

1 个答案:

答案 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()以仅获取默认图像。有了它你不需要调用组,查询将执行得更快。