ServiceStack OrmLite LeftJoin问题

时间:2014-06-23 12:59:20

标签: sql servicestack left-join ormlite-servicestack

我正在使用带有左连接的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

1 个答案:

答案 0 :(得分: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);