为什么这个可选参数LINQ WHERE不起作用?

时间:2017-05-19 17:07:34

标签: c# asp.net linq controllers

当MesAno是“”//string.Empty

        DateTime dateAux;
        int ano = 0;
        int mes = 0;
        if (MesAno.Trim() != "" && DateTime.TryParse("01/" + MesAno, out dateAux))
        {
            ano = dateAux.Year;
            mes = dateAux.Month;
        }


                lista = session.Query<Evidencias>().Timeout(30)
                    .Where(m => m.Produto.Distribuidora.Id == myUser.Terceiro.Distribuidora.Id)
                    //.Where(m => MesAno != "" ? (m.DataInclusao.Year == ano && m.DataInclusao.Month == mes) : true)
                    .Where(m => Produto != "" ? m.Produto.CodigoProduto.Contains(Produto) : true)
                    .Where(m => Titular != "" ? m.NomeTitular.Contains(Titular) : true)
                    .Where(m => Instalacao != "" ? m.CodigoInstalacao.Contains(Instalacao) : true)
                    .Where(m => ano != 0 ? m.DataInclusao.Year == ano : true)
                    .Where(m => mes != 0 ? m.DataInclusao.Month == mes : true)
                    .OrderByDescending(m => m.DataInclusao).Take(3000).ToList();

然后生成的SQL WHERE是:

 where produto1_.IdDistribuidora=@P2 and @P3=1 and @P4=1 and @P5=1 and datepart(year, evidencias0_.DataInclusao)=@P6 and datepart(month, evidencias0_.DataInclusao)=@P7 order by evidencias0_.DataInclusao desc',N'@P1 int,@P2 int,@P3 bit,@P4 bit,@P5 bit,@P6 int,@P7 int',3000,1,1,1,1,0,0

陌生人的部分是:

datepart(year, evidencias0_.DataInclusao)=@P6 and datepart(month, evidencias0_.DataInclusao)=@P7

为什么不这样:

@P6=1 and @P7=1

1 个答案:

答案 0 :(得分:4)

当然很奇怪,但没有人是完美的 - 将LINQ表达式树转换为SQL是一个相当复杂的主题,必须考虑很多事情,因此可能会错过一些明显的&#34;对于人类。因此,翻译并不总是完美的,但只要它不产生异常并产生正确的结果,它就应该是可接受的。

但是,通过编写自定义条件IQueryable<T>扩展方法,您可以轻松帮助翻译人员避免冗余参数和条件(至少对于像您这样的顶级Where):

public static class QueryableExtensions
{
    public static IQueryable<T> WhereIf<T>(this IQueryable<T> source, bool condition, Expression<Func<T, bool>> predicate)
    {
        return condition ? source.Where(predicate) : source;
    }
}

所以你可以使用:

lista = session.Query<Evidencias>().Timeout(30)
      .Where(m => m.Produto.Distribuidora.Id == myUser.Terceiro.Distribuidora.Id)
      .WhereIf(Produto != "", m => m.Produto.CodigoProduto.Contains(Produto))
      .WhereIf(Titular != "", m => m.NomeTitular.Contains(Titular))
      .WhereIf(Instalacao != "", m => m.CodigoInstalacao.Contains(Instalacao))
      .WhereIf(ano != 0, m => m.DataInclusao.Year == ano)
      .WhereIf(mes != 0, m => m.DataInclusao.Month == mes)
      .OrderByDescending(m => m.DataInclusao).Take(3000).ToList();

并且生成的SQL不会有@ P4,@ P5,@ P6,@ P7参数和奇怪的条件。