当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
答案 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参数和奇怪的条件。