ormlite连接

n3ipq98p  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(301)

我在选择相同的产品时遇到了一些问题 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);

我很抱歉,如果我不清楚,但我不能张贴真正的代码由于保密协议。
另外,我和你一起工作 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 方法接受类型的第一个参数 IDbConnection 找不到(编译器告诉我,在意大利语中,我重新措辞)。
编译器的错误代码是 CS1061 .

tyu7yeag

tyu7yeag1#

你将不能使用 SelectMulti 用于选择具有联接别名的表的api。在ormlite的主页中有一个从多个具有连接别名的表中进行选择的示例:

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"),
    });

当需要更精细的定制时,可以将定制sql与动态resultsetapi一起使用。
我刚刚添加了对在这个提交中指定自定义表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;
}

此更改可从myget上的v5.0.3中获得。
如果无法升级,则可以使用自定义选择来实现相同的结果,例如:

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);

相关问题