我想编写一个使用Ormlite的SqlExpressionVisitor通过null cheking参数使用一个方法查询表的方法 这是我的方法:
public static List<UserChatsDTO> GetUserChats(int startRow, int rowCount, DateTime? startDate, DateTime? endDate, string operatorName, short? rating, string visitorName)
{
using (IDbConnection db = DbFactory.OpenDbConnection())
{
SqlExpressionVisitor<UserChatsDTO> ev = OrmLiteConfig.DialectProvider.ExpressionVisitor<UserChatsDTO>();
ev.Where(q =>
(startDate.HasValue && q.Dated >= startDate) &&
(endDate.HasValue && q.Dated <= endDate) &&
(!string.IsNullOrEmpty(operatorName) && q.TakenByUser.Contains(operatorName)) &&
(rating.HasValue && q.Rating == (short)rating) &&
(!string.IsNullOrEmpty(visitorName) && q.VisitorName.Contains(visitorName)));
//ev.OrderBy();
ev.Limit(startRow, rowCount);
return db.Select<UserChatsDTO>(ev);
}
}
但是Object引用未设置为对象的实例。当我调用ev.Where部分时抛出NullReferenceException。
这里有错误还是我错过了什么? 谢谢。
答案 0 :(得分:5)
您实际上可以在Select方法中构建ExpressionVisitor,如下所示:
var chats = db.Select<UserChatsDTO>(q => q
.Where(x => startDate.HasValue && x.Date >= startDate)
.Where(x => endDate.HasValue && x.Date <= endDate)
.Where(x => string.IsNullOrEmpty(operatorName) || x.TakeByUser.Contains(operatorName))
.Where(x => rating.HasValue && x.Rating == (short)rating)
.Where(x => string.IsNullOrEmpty(visitorName) || x.VisitorName.Contains(visitorName)
.Limit(startRow, rowCount));
答案 1 :(得分:3)
我知道这个问题是7个月大,但我有类似的问题&amp;这是我搜索时出现的第一个问题。我想加入我的工作解决方案,因为Master Moral's对我不起作用。
最初,我尝试的语法大致类似于mustafasturan的第一次尝试。我得到了相同的NullReferenceException。师父道德的答案也无济于事......
我正在尝试构建一个执行LIKE搜索而不是完全匹配的搜索功能。请求对象上有多个标准可能为空,也可能不为空(为简单起见,我们将使用带有2个标准的示例)。遵循Master Morality的建议,我尝试了这个:
var searchResults = db.Select<Item>(q => q
.Where(x => string.IsNullOrWhiteSpace(request.Criteria1) || x.Criteria1.Contains(request.Criteria1))
.Where(x => string.IsNullOrWhiteSpace(request.Criteria2) || x.Criteria2.Contains(request.Criteria2))
);
我仍然有一个NullReferenceException。好像&amp;&amp;和||运算符不在lambda表达式中使用短路评估。
我最终不得不接受的是:
SqlExpressionVisitor<Item> ev = new ServiceStack.OrmLite.MySql.MySqlExpressionVisitor<Item>();
if (!String.IsNullOrWhiteSpace(request.Criteria1)) {
ev.Where(q => q.Criteria1.Contains(request.Criteria1));
}
if (!String.IsNullOrWhiteSpace(request.Criteria2)) {
ev.Where(q => q.Criteria2.Contains(request.Criteria2));
}
searchResults = db.Select<Item>(ev);
它感觉不是很优雅,但它是我能找到的唯一有效的东西。