ORMLite连接多个表和多选

时间:2018-01-08 16:29:36

标签: c# mysql ormlite-servicestack

我在使用model选择相同ORMLite两次或更多次时遇到一些问题。

我的查询执行各种LeftJoin<Model1,Model2>,然后执行以下操作:

.LeftJoin<Model2, Model3>((x, y) => x.id1== y.id1, dbConnection.JoinAlias("Alias1")
.LeftJoin<Model2, Model3>((x, y) => x.id2 == y.id2, dbConnection.JoinAlias("Alias2")
.LeftJoin<Model2, Model3>((x, y) => x.id3 == y.id3, dbConnection.JoinAlias("Alias3")
.LeftJoin<Model2, Model3>((x, y) => x.id4 == y.id4, dbConnection.JoinAlias("Alias4"))

如何使用SelectMulti获得4次Model3?我的意思是这样的:

db.SelectMulti<Model1,Model2,Model3,Model3,Model3,Model3>(query);

如果我不清楚,我很抱歉,但由于NDA,我无法发布实际代码。

PS。我正在使用C#

更新

我在@ mythz的建议之后添加了以下代码(这是答案的最后一部分,因为我现在无法升级):

String customSelection = typeof(Model1).GetModelMetadata().Alias + ".*, 0 EOT," +
                         typeof(Model2).GetModelMetadata().Alias + ".*, 0 EOT," +
                         "Alias1.*, 0 EOT," +
                         "Alias2.*, 0 EOT," +
                         "Alias3.*, 0 EOT," +
                         "Alias4.*, 0 EOT";

然后,在我的查询中,我添加了这个:

.Select(customSelection);

现在我试着用这个得到结果:

dbConnection.Select<Model1, Model2, Model3, Model3, Model3, Model3>(query);

这导致编译错误,它告诉我IDbConnection不包含Select的定义和Select方法接受类型{{1}的第一个参数} 没找到。 (编译告诉我,在意大利语中,我正在改写它。)

编译器的错误代码是IDbConnection

1 个答案:

答案 0 :(得分:1)

您无法使用SelectMulti API来选择包含加入别名的表格。在OrmLite的主页中有一个example of selecting from multiple tables个JOIN别名:

var q = db.From<Sale>()
    .LeftJoin<Contact>((s,c) => s.SellerId == c.Id, db.JoinAlias("seller"))
    .LeftJoin<Contact>((s,c) => s.BuyerId == c.Id, db.JoinAlias("buyer"))
    .Select<Sale, Contact>((s,c) => new {
        s,
        BuyerFirstName = Sql.JoinAlias(c.FirstName, "buyer"),
        BuyerLastName = Sql.JoinAlias(c.LastName, "buyer"),
        SellerFirstName = Sql.JoinAlias(c.FirstName, "seller"),
        SellerLastName = Sql.JoinAlias(c.LastName, "seller"),
    });

如果需要更精细的自定义,您可use Custom SQL使用Dynamic ResultSet APIs

我刚刚添加了支持,可以在this commit中指定自定义表格选项,这将允许您使用自定义别名选择表格,例如:

q = db.From<Sale>()
    .LeftJoin<Contact>((s, c) => s.SellerId == c.Id, db.JoinAlias("seller"))
    .LeftJoin<Contact>((s, c) => s.BuyerId == c.Id, db.JoinAlias("buyer"));

var results = db.SelectMulti<Sale, Contact, Contact>(q, 
    new[] { "Sale.*", "buyer.*", "seller.*" })

foreach (var result in results) 
{
    Sale sale = result.Item1;
    Contact buyer = result.Item2;
    Contact seller = result.Item3;
}

此更改可从v5.0.3获得,现在为available on MyGet

如果无法升级,可以使用自定义选择获得相同的结果,例如:

var q = db.From<Sale>()
    .LeftJoin<Contact>((s, c) => s.SellerId == c.Id, db.JoinAlias("seller"))
    .LeftJoin<Contact>((s, c) => s.BuyerId == c.Id, db.JoinAlias("buyer"))
    .Select("Sale.*, 0 EOT, buyer.*, 0 EOT, seller.*, 0 EOT");

var results = db.Select<Tuple<Sale, ContactIssue, ContactIssue>>(q);