如果是传统的应用程序开发,采取动态拼 Sql字符串的形式就可以解决了,但Linq代码是没办法间歇性判断而拼接.
首先UI上查询条件的项目往往并不确定,如上图目前有城市、订单数目,将来可能有新的项目要增加,结果将导致代码频繁更改,对于这种情况无论是拼Sql时代,还是如今的Linq都不太容易应对,故而当有新的查询项目添进时,就多加一个查询条件。
另一个问题,当城市输入框为空时,那么对城市条件的限定则不应当加入Linq语句。
比如
string city = "";
Linq语句片段:where c.City.Contains(city);
当city为空时,上述片段不应该成为在Linq语句的一部分,这该怎么办呢? 总不能在Linq代码中间写 if(city != "")吧?!
真正的技巧很简单:
string city = queryItems.City; int ordersCount = queryItems.OrdersCount; var query = from c in dbContext.Customers where (String.IsNullOrEmpty(city) ? true : c.City.Contains(city)) && (ordersCount == 0 ? true : c.Orders.Count > ordersCount) select c; string queryString = query.ToString(); return query.ToList();
显而易见,在where子句中可以使用三元运算符进行条件判断:
当条件不符合时返回一个true值,Linq在翻译为Sql语句时将忽略true;
而条件符合时将返回预期的表达式语句。