我使用ServiceStack OrmLite PredicateBuilder动态构建WHERE语句:
var q = PredicateBuilder.True<ItemList>();
if (!filter.Keyword.IsNullOrWhiteSpace())
{
q = q.And(i => i.Brand.Contains(filter.Keyword) || i.ItemDescription.Contains(filter.Keyword) || i.Serial.Contains(filter.Keyword));
}
if (!filter.ItemStatus.IsNullOrWhiteSpace())
{
q=q.And(i => i.ItemStatus == filter.ItemStatus);
}
var count = await Db.CountAsync(Db.From<ItemList>().Where(q));
如果没有满足if语句条件,则在执行查询时出错:
在上下文中指定的非布尔类型的表达式 条件是预期的,接近&#39; ORDER&#39;
原因是生成的查询是:
从ItemList WHERE True
中选择[字段列表]
更新:我正在使用SQL Server 2012方言提供程序。
这显然无效,这是预期的行为吗?
我可以使用布尔值来检查是否满足任何条件,然后应用谓词表达式,但这很麻烦。
我期待如果只使用谓词而没有任何添加的子句我会得到:
WHERE True = True
或等同的东西。
这是使用PredicateBuilder的正确方法吗?