我正在使用带有左连接的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只允许在一个列上进行连接,并生成如此
的SQLSELECT
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
答案 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);