在 ServiceStack.OrmLite 中多次加入相同的 table
Joining same table multiple times in ServiceStack.OrmLite
将 table 连接到自身时,生成的 sql 语句未正确引用 table。
当 "main" table 不同于连接 table https://github.com/ServiceStack/ServiceStack.OrmLite#join-aliases
Class
public class Page
{
public string ActivityId { get; set; }
public int DefinitionId { get; set; }
public int PageId { get; set; }
}
代码
using (var db = connection.Open())
{
var sql = db.From<Page>()
.Join<Page>((p1, p2) =>
p1.DefinitionId == 349 &&
p1.ActivityId == "a633326227969545457" &&
p1.PageId == p2.PageId &&
p2.DefinitionId == 340, db.JoinAlias("p2"))
.Select<Page>(p => new {
String = Sql.JoinAlias(p.ActivityId, "p2")
});
}
SQL 语句
p1.DefinitionId == 349 and p1.ActivityId == "a633326227969545457",这些应该不是指p2
SELECT p2."ActivityId" AS String
FROM "Page" INNER JOIN "Page" p2 ON (
((("p2"."DefinitionId" = 349)
AND ("p2"."ActivityId" = 'a633326227969545457'))
AND ("p2"."PageId" = "p2"."PageId"))
AND ("p2"."DefinitionId" = 340))
这是一个错误还是我在这里遗漏了什么?
为了能够在源 table 上使用别名,您需要设置一个 table 别名,直到现在 this commit.
您现在可以在源 table 和任何连接 [=22] 上使用新的 db.TableAlias()
API(现在优于 JoinAlias()
) =]s,例如:
var q = db.From<Page>(db.TableAlias("p1"))
.Join<Page>((p1, p2) =>
p1.DefinitionId == 349 &&
p1.ActivityId == "a633326227969545457" &&
p1.PageId == p2.PageId &&
p2.DefinitionId == 340, db.TableAlias("p2"))
.Select<Page>(p => new {
String = Sql.TableAlias(p.ActivityId, "p2")
});
var rows = db.Select(q);
此更改适用于现在 available on MyGet 的 v5.4.1。
将 table 连接到自身时,生成的 sql 语句未正确引用 table。
当 "main" table 不同于连接 table https://github.com/ServiceStack/ServiceStack.OrmLite#join-aliases
Class
public class Page
{
public string ActivityId { get; set; }
public int DefinitionId { get; set; }
public int PageId { get; set; }
}
代码
using (var db = connection.Open())
{
var sql = db.From<Page>()
.Join<Page>((p1, p2) =>
p1.DefinitionId == 349 &&
p1.ActivityId == "a633326227969545457" &&
p1.PageId == p2.PageId &&
p2.DefinitionId == 340, db.JoinAlias("p2"))
.Select<Page>(p => new {
String = Sql.JoinAlias(p.ActivityId, "p2")
});
}
SQL 语句
p1.DefinitionId == 349 and p1.ActivityId == "a633326227969545457",这些应该不是指p2
SELECT p2."ActivityId" AS String
FROM "Page" INNER JOIN "Page" p2 ON (
((("p2"."DefinitionId" = 349)
AND ("p2"."ActivityId" = 'a633326227969545457'))
AND ("p2"."PageId" = "p2"."PageId"))
AND ("p2"."DefinitionId" = 340))
这是一个错误还是我在这里遗漏了什么?
为了能够在源 table 上使用别名,您需要设置一个 table 别名,直到现在 this commit.
您现在可以在源 table 和任何连接 [=22] 上使用新的 db.TableAlias()
API(现在优于 JoinAlias()
) =]s,例如:
var q = db.From<Page>(db.TableAlias("p1"))
.Join<Page>((p1, p2) =>
p1.DefinitionId == 349 &&
p1.ActivityId == "a633326227969545457" &&
p1.PageId == p2.PageId &&
p2.DefinitionId == 340, db.TableAlias("p2"))
.Select<Page>(p => new {
String = Sql.TableAlias(p.ActivityId, "p2")
});
var rows = db.Select(q);
此更改适用于现在 available on MyGet 的 v5.4.1。