【问题标题】:ServiceStack Ormlite SqlExpressionVisitor null check in Where extensionServiceStack Ormlite SqlExpressionVisitor null check in Where 扩展
【发布时间】:2013-05-08 15:50:44
【问题描述】:

我想用一个方法来写一个查询表的方法,通过使用 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);
            }
        }

但对象引用未设置为对象的实例。当我调用 ev.Where 部分时抛出 NullReferenceException。

这里有错误还是我遗漏了什么? 谢谢。

【问题讨论】:

    标签: servicestack ormlite-servicestack


    【解决方案1】:

    您实际上可以像这样在 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));
    

    【讨论】:

    • 我仍然使用这种方法获得 NullReferenceException。我添加了一个可行的解决方案。
    【解决方案2】:

    我知道这个问题已经 7 个月了,但我遇到了类似的问题,这是我搜索时出现的第一个问题。我想添加我的工作解决方案,因为 Master Morality's 对我不起作用。

    最初,我尝试的语法与 mustafasturan 的第一次尝试大致相似。我得到了与他相同的 NullReferenceException。道德大师的回答也没有帮助......

    我正在尝试构建一个执行 LIKE 搜索而不是完全匹配的搜索功能。请求对象上有多个条件,它们可能为空,也可能不为空(为简单起见,我们将使用具有 2 个条件的示例)。按照道德大师的建议,我尝试了这个:

    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。看起来像 && 和 ||运算符没有在 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);
    

    感觉不是很优雅,但这是我能找到的唯一有效的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      相关资源
      最近更新 更多