C# 多个左连接和动态where

C# 多个左连接和动态where,c#,linq,entity-framework,C#,Linq,Entity Framework,我假装要为一个产品建立一个搜索页面 Whit将多个表单变量并将它们集成到此查询中。。 动态。。在独立类的where子句中,如ProductoAtributo或其他 和d 我想要的T-SQL查询 动态何处更新 您的错误表明您尝试使用错误的参数调用方法,这是因为您的谓词是用于IQueryable扩展的表达式,但当您使用时,您得到的不是IQueryable,而是IEnumeration,所以对于solve,我看到了两条路径 第一:将谓词的类型从表达式更改为Func 或 第二:将分组结果转换为IQuer

我假装要为一个产品建立一个搜索页面 Whit将多个表单变量并将它们集成到此查询中。。 动态。。在独立类的where子句中,如ProductoAtributo或其他

和d

我想要的T-SQL查询

动态何处更新


您的错误表明您尝试使用错误的参数调用方法,这是因为您的谓词是用于IQueryable扩展的表达式,但当您使用时,您得到的不是IQueryable,而是IEnumeration,所以对于solve,我看到了两条路径

第一:将谓词的类型从表达式更改为Func

第二:将分组结果转换为IQueryable,即


我安装了Linqer。。。要将t-sql转换为linq附加的bin文件夹项目,并连接到sql server…自动生成edml。。在那之后,我得到了我的查询的正确linq

到目前为止,错误被放在ProductOtDistributionWhere的DefaultifEmpty之前,而正确的筛选器则在其后

谢谢@Grundy..你的表情提示和AsQueryable非常强大

更新代码


请您尝试在关闭.net本地化的情况下运行此程序,我无法读取代码中的异常。我也很难理解你所说的“动态位置”是什么意思。Where谓词的逻辑是什么?我认为pajoin已经不是ProductOtDistributo集合,因此需要更改表达式类型此处公开了Where的逻辑@DiegoOrtega您在tpjoin中TpaJ的查询中是否有键入错误。DefaultIfEmpty您可能是指TpaJ中的TpaJ。DefaultIfEmpty?您是对的,但是现在我有28行..Grundy,谢谢您的回答错误消失了。。然而,尝试var producto1=producto.ToList;我得到一个无效的Exeption 1025内部错误.NET Framework数据提供程序。@DiegoOrtega,对不起,我不太明白你的意思,你能再解释一下吗?我试图用toList方法转换linq结果,但在这个过程中抛出了一个无效的异常…@DiegoOrtega,噢,我看到您应用了所有路径:-尝试为ProductOATributionWhere声明返回表达式Exeption dissapes..但是T-sql 3行与Linq 26行的结果不同
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 )
 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
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();
....
join Pa in db.ProductoAtributo on P.ProductoId equals Pa.ProductoId into pajoin
from PaJ in pajoin.AsQueryable().Where(productoAtributoWhere).DefaultIfEmpty()
....
    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();