【问题标题】:modify existing where condition in sql expression修改sql表达式中已有的where条件
【发布时间】:2016-12-28 17:12:44
【问题描述】:

将此 Sql 表达式作为 输入 参数:(假设无法修改此输入参数的生成方式)

Db.From<Contact>().Where(C => C.Email != null).Or(C => C.Reference != null);

该方法需要附加另一个条件,例如

exp.And(C.UserId == Session.UserId);

但是,无论任何现有条件如何,UserId 条件都必须为真。但由于原始的 Sql 表达式使用“或”,因此未强制执行 UserId 条件。

所以最终的 Sql 应该是这样的:

SELECT * FROM Contact WHERE (Email IS NOT NULL OR Reference IS NOT NULL) AND UserId == 12

此刻生成的Sql如下:

SELECT * FROM Contact WHERE Email IS NOT NULL OR Reference IS NOT NULL AND UserId == 12

有人有什么想法吗?

编辑: 到目前为止,唯一可行的方法是破解 WhereExpression 以在原始 Sql 表达式的 Where 子句之前和之后添加 ()。只是希望有更好的方法。

【问题讨论】:

    标签: c# mysql ormlite-servicestack


    【解决方案1】:
    .Where(C => C.UserId == Session.UserId)
    

    【讨论】:

    • 这似乎与“And”的行为相同,因此原始 Sql 表达式中的“Or”条件将覆盖此处定义的任何条件。
    • @vonec 嗯,这听起来像是 sql 生成器中的错误; Where 应该适用于整个 IQueryable&lt;T&gt;
    • @vonec 在这种情况下,您将不得不重建Expression 树(可能通过ExpressionVisitor); .Expression 在对象上可用吗?
    • 我正在使用 ServiceStack OrmLite,如果有帮助的话。您是说拥有.Where(condition1).Or(condition2).And(condition3); 意味着条件1 必须始终为真吗?我觉得不合适……
    • @vonec 我什么都没说And。我使用 Where 是有原因的。
    猜你喜欢
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    相关资源
    最近更新 更多