【问题标题】:OrmLite join table by multiple columnsOrmLite 通过多列连接表
【发布时间】:2020-03-05 13:29:08
【问题描述】:

使用 OrmLite 如何按多列连接表格?

我有Notes 表,其中可以包含QutoeHeaderOrderHeader 的数据,所以我尝试像这样加入和使用SelectMulti()

var userSpecificQuery =
    _db
        .From<Customer>()
        .Where(x => x.SalesRepresentativeId == userId)
        .LeftJoin<Customer, QuoteHeader>((c, q) => c.Id == q.CustomerId)
        .LeftJoin<Customer, OrderHeader>((c, o) => c.Id == o.CustomerId)
        .LeftJoin<OrderHeader, QuoteHeader, Notes>((oh,qh, n) => oh.Id == n.OrderId || qh.Id == n.QuoteId)
    ;


var userSpecificRecords = 
    _db.SelectMulti<Customer, QuoteHeader, OrderHeader, Notes>(userSpecificQuery);

但我得到错误:

多次指定表名“quote_header”

我想加入与 OrderId 或 QuoteId 匹配的所有记录。我尝试了几种不同的方法并得到相同的错误。这可能吗?

编辑:

这是笔记模型

public class Notes : BaseModel
{
    [AutoIncrement]
    public long Id { get; set; }
    [ForeignKey(typeof(QuoteHeader))]
    public long? QuoteId { get; set; }
    [ForeignKey(typeof(OrderHeader))]
    public long? OrderId { get; set; }
    public string NoteText { get; set; }
}

【问题讨论】:

    标签: servicestack ormlite-servicestack


    【解决方案1】:

    不要多次加入QuoteHeader,而是将条件移动到Where

    db.From<Customer>()
      .Where(x => x.SalesRepresentativeId == userId)
      .LeftJoin<Customer, QuoteHeader>((c, q) => c.Id == q.CustomerId)
      .LeftJoin<Customer, OrderHeader>((c, o) => c.Id == o.CustomerId)
      .LeftJoin<OrderHeader, Notes>((oh, n) => oh.Id == n.OrderId)
      .Where<OrderHeader,QuoteHeader,Notes>((oh,qh,n) => oh.OrderId != null || qh.Id == n.QuoteId)
    

    【讨论】:

    • 嘿神话感谢您的回复。 Note 可以有 OrderId 或 QuoteId(可为空的 long)。我想如果我在 OrderId 上离开加入,那么我将不会获得具有 QuoteId 但没有 OrderId 的记录。
    • @Guerrilla 你应该可以将它添加到 Where?我已经更新了我的答案。
    • 感谢您的更新。 OrderId 和 QuoteId 是笔记模型上的字段(我更新了原始问题)。联接不会获取所有记录,因此我认为按 null 过滤将不起作用。
    • @Guerrilla 你已经离开加入了 QuoteHeader?如果这不符合您的要求,您需要use Custom SQL,因为 SelectMulti 无法从多个相同的表中明确选择。如果您不需要使用 SelectMulti,您可以使用 table aliases
    • 是的,我认为这需要自定义 SQL。当我开始制作原始 sql 时,我意识到我需要子查询和完整的外部联接/联合,因此将其拆分为多个查询可能更容易。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2017-06-10
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多