ORMLite 加入多个表和多选
ORMLite join with multiple tables and multiselect
我在使用 ORMLite
选择相同的 model
两次或更多次时遇到一些问题。
我的查询执行各种 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);
很抱歉,如果我不清楚,但由于保密协议,我不能post真正的代码。
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
方法21=] 未找到。 (编译器告诉我意大利语,我正在改写它)。
编译器的错误代码是CS1061
。
您将无法将 SelectMulti
API 用于 select 连接别名的表格。 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 with the Dynamic ResultSet APIs。
我刚刚添加了对能够在 this commit 中指定自定义 Table Select 的支持,这将允许您使用自定义别名 select 表,例如:
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;
}
此更改适用于现在 available on MyGet 的 v5.0.3。
如果您无法升级,您可以使用自定义 Select 获得相同的结果,例如:
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);
我在使用 ORMLite
选择相同的 model
两次或更多次时遇到一些问题。
我的查询执行各种 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);
很抱歉,如果我不清楚,但由于保密协议,我不能post真正的代码。
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
方法21=] 未找到。 (编译器告诉我意大利语,我正在改写它)。
编译器的错误代码是CS1061
。
您将无法将 SelectMulti
API 用于 select 连接别名的表格。 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 with the Dynamic ResultSet APIs。
我刚刚添加了对能够在 this commit 中指定自定义 Table Select 的支持,这将允许您使用自定义别名 select 表,例如:
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;
}
此更改适用于现在 available on MyGet 的 v5.0.3。
如果您无法升级,您可以使用自定义 Select 获得相同的结果,例如:
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);