【问题标题】:ServiceStack OrmLite LeftJoin IssueServiceStack OrmLite LeftJoin 问题
【发布时间】:2014-06-23 12:59:20
【问题描述】:

我正在使用带有左连接的 ServiceStack OrmLite JoinSQLBuilder 并发现了一个问题。 假设我有 2 个表,TableA 和 TableB,并且想要加入多个值。

在 SQL 中,我会这样做:

SELECT  
    TableA.Name, 
    TableB.Value
FROM    
    TableA
LEFT JOIN 
    TableB 
ON     
    TableB.AId = TableA.Id
    AND TableB.PostCode = '12345'  

现在 JoinSQLBuilder 只允许在单个列上进行连接并像这样生成 SQL

SELECT  
    TableA.Name, 
    TableB.Value
FROM    
    TableA
LEFT JOIN 
    TableB 
ON     
    TableB.AId = TableA.Id
WHERE
    TableB.PostCode = '12345'  

这根本不是一回事!

ServiceStack OrmLite 有什么办法解决这个问题吗? 这是一个带有 where 子句的左连接示例:Left Join With Where Clause

【问题讨论】:

    标签: sql servicestack left-join ormlite-servicestack


    【解决方案1】:

    您应该可以使用new support for JOIN's in OrmLite's Typed SqlExpressions。 最好使用最新的v4.0.23 release on MyGet,其中包括对selecting multiple columns across joined tables 的改进支持。

    使用新的 JOIN API,您可以做您需要的事情,例如:

    public class TableA
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    
    public class TableB
    {
        public int AId { get; set; }
        public string PostCode { get; set; }
        public string Value { get; set; }
    }
    
    public class TableABFields
    {
        public string TableAName { get; set; }
        public string TableBValue { get; set; }
    }
    
    var results = db.Select<TableABFields,TableA>(q =>
        q.Join<TableA,TableB>((a,b) => b.AId == a.Id && b.PostCode == "12345"));
    

    使用 explicit SQL Expression 的替代 API:

    var q = db.From<TableA>();
    // or 
    var q = OrmLiteConfig.DialectProvider.SqlExpression<TableA>();
    
    
    q.Join<TableA,TableB>((a,b) => b.AId == a.Id && b.PostCode == "12345");
    
    var results = db.Select(q);
    

    【讨论】:

    • 能够在不需要“db”加入的情况下建立谓词会很好。例如,在将连接传递给数据访问之前,在存储库层中构建连接。 db.Join(谓词);
    • 谢谢您 - 我的图层运行良好。更新到最新版本后,我收到错误“找不到方法:'Void ServiceStack.OrmLite.SqlExpression`1..ctor()'。”来自 connection.Single(x => x.Id == id && x.IsDeleted == false);
    • @ByronCobb 这表明存在脏版本不匹配问题。我刚刚使用MyGet package 使用Created a new Console App for this,它按预期工作。确保您的所有软件包都已更新,否则我会重新安装所有 ServiceStack 软件包。
    • 谢谢,这就是问题所在。我一直在寻找更多 - 我应该开始一个新问题吗?看来我不能再使用继承的类值了=> TableA:BaseEntity => BaseEntity.IsDeleted = MySql.Data.MySqlClient.MySqlException:'where 子句'中的未知列'BaseEntity.IsDeleted'
    • @ByronCobb 是的,你能用产生错误的异常和源代码打开一个新问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多