2013-12-20 25 views
1

我假装建立一个搜索页面的产品 白衣倍数形式变量,并将它们集成动态对此查询.. ..在独立类像ProductoAtributo的条款或其他多个左联接和动态where

而且d

T-SQL查询(即我想要的)

SELECT 
    p.*, tpa.*, pa.*, tp.* 
FROM 
    Producto p 
LEFT JOIN 
     ProductoAtributo pa ON pa.ProductoId=p.ProductoId 
LEFT JOIN 
     TipoProductoAtributo tpa ON tpa.AtributoId=pa.AtributoId AND tpa.TipoProductoId=p.TipoProductoId 
LEFT JOIN 
     TipoProducto tp ON p.TipoProductoId = tp.TipoProductoId 
WHERE 
     (pa.Valor = '3' AND pa.AtributoId=7) OR (pa.Valor = '3' AND pa.AtributoId=6) 

动力在哪里 - UP DATED

Func<ProductoAtributo, bool> productoAtributoWhere = Pa => true; 


      string CantidadDormitorios = "3"; 


      if (! String.IsNullOrEmpty(CantidadDormitorios)) 
      { 
       productoAtributoWhere = Pa => (Pa.Valor == CantidadDormitorios && Pa.AtributoId == 7) || (Pa.Valor == CantidadDormitorios && Pa.AtributoId == 6); 
      } 

的尝试 - >我最亲密的形式给出 - 更新

var producto = from P in db.Producto 
          join Tp in db.TipoProducto on P.TipoProductoId equals Tp.TipoProductoId into tpjoin 
          from TpJ in tpjoin.DefaultIfEmpty() 
          join Pa in db.ProductoAtributo on P.ProductoId equals Pa.ProductoId into pajoin 
          from PaJ in pajoin.AsQueryable<ProductoAtributo>().Where(productoAtributoWhere).DefaultIfEmpty() 
          join Tpa in db.TipoProductoAtributo on PaJ.AtributoId equals Tpa.AtributoId into tpajoin 
          from TpaJ in tpjoin.DefaultIfEmpty() 
          select new { P }; 
      var producto1 = producto.ToList(); 

的错误

Error 3 'System.Collections.Generic.IEnumerable<SGI.Models.ProductoAtributo>' no contiene una definición para 'Where' y la mejor sobrecarga del método de extensión 'System.Linq.Enumerable.Where<TSource>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,int,bool>)' tiene algunos argumentos no válidos D:\Documentos\SGI6\SGI\Areas\Cotizacion\Controllers\CotizacionController.cs 55 22 Cotizacion 

Error 4 Argumento 2: no se puede convertir de 'System.Linq.Expressions.Expression<System.Func<SGI.Models.ProductoAtributo,bool>>' a 'System.Func<SGI.Models.ProductoAtributo,int,bool>'. D:\Documentos\SGI6\SGI\Areas\Cotizacion\Controllers\CotizacionController.cs 55 35 Cotizacion 

左侧加入之前 - >“从TPJ在tpjoin .DefaultIfEmpty()“ 没有错误... 如果我traslade到“在db.ProductoAtributo中加入Pa” - >在db.ProductoAtributo中加入Pa。(productoAtributoWhere) 没有错误太.. ..但是t-sql查询返回3个寄存器vs 26个linq

没有在那里... LINQ和T-SQL显示了同样的结果

希望,你能帮助我.. 问候

这没有离开原来的查询联接修订

var producto = from P in db.Producto 
          join Tp in db.TipoProducto on P.TipoProductoId equals Tp.TipoProductoId 
          join Pa in db.ProductoAtributo.Where(productoAtributoWhere) on P.ProductoId equals Pa.ProductoId 
          join Tpa in db.TipoProductoAtributo on Pa.AtributoId equals Tpa.AtributoId 
          select new { P }; 
      var producto1 = producto.ToList(); 
+0

能不能请你与你的.NET本地化运行该关闭的,我看不懂你的代码中的例外。另外,我在解决“动态”的含义时遇到了麻烦。 “Where”谓词的逻辑是什么? – Aron

+0

我觉得'pajoin'已经不是'ProductoAtributo'集合,所以你需要改变你的表达类型 – Grundy

+0

我的逻辑在哪里被暴露在这里.. http://stackoverflow.com/a/1263587/493166 –

回答

1

你的错误,说你尝试调用方法与错误的参数,它是因为你谓词表达式使用IQueryable扩展,但是当你用join..into clause你不IQueryable,但IEnumeration,所以对解决我看到两个路径

第一:谓语从Expression<Func<ProductoAtributo, bool>>Func<ProductoAtributo, bool>

OR

变化类型:转换您细分电子邮件结果IQueryable

.... 
join Pa in db.ProductoAtributo on P.ProductoId equals Pa.ProductoId into pajoin 
from PaJ in pajoin.AsQueryable().Where(productoAtributoWhere).DefaultIfEmpty() 
.... 
+0

Grundy,谢谢你的回答错误消失..但是企图 var producto1 = producto.ToList(); 我得到一个无效的执行 1025内部错误.NET Framework数据提供程序。 –

+0

@DiegoOrtega,对不起,我不太明白你的意思,你能解释一下吗? – Grundy

+0

我试图将linq结果与toList()方法一起转换,在这个过程中抛出无效异常... –

1

我安装Linqer ...翻译T-SQL中的LINQ附bin文件夹项目,并连接到SQL Server ...产生EDML atuotmatically ..之后,我得到了正确的LINQ我查询...

到目前为止错误是把productoAtributoWhere的DefaultifEmpty(),当正确的过滤器是后前...

感谢@Grundy ..your的提示到ExpressionsAsQueryable被有力。

更新的代码

Expression<Func<ProductoAtributo, bool>> productoAtributoWhere = pa => true; 


       string CantidadDormitorios = ""; 


       if (! String.IsNullOrEmpty(CantidadDormitorios)) 
       { 
        productoAtributoWhere = pa => (pa.Valor == CantidadDormitorios && pa.AtributoId == 7) || (pa.Valor == CantidadDormitorios && pa.AtributoId == 6); 
       } 

    var producto = from p in db.Producto 
            join pa in db.ProductoAtributo on p.ProductoId equals pa.ProductoId into pa_join 
            from pa in pa_join.DefaultIfEmpty().AsQueryable().Where(productoAtributoWhere) 
            join tpa in db.TipoProductoAtributo 
             on new { pa.AtributoId, p.TipoProductoId } 
            equals new { tpa.AtributoId, tpa.TipoProductoId } into tpa_join 
            from tpa in tpa_join.DefaultIfEmpty() 
            join tp in db.TipoProducto on p.TipoProductoId equals tp.TipoProductoId into tp_join 
            from tp in tp_join.DefaultIfEmpty() 
select new 
          { p }; 
     var producto1 = producto.ToList();