OrmLite соединяет таблицу по нескольким столбцам - PullRequest
2 голосов
/ 05 марта 2020

С OrmLite, как я могу присоединиться к таблице по нескольким столбцам?

У меня есть Notes таблица, которая может содержать данные для QutoeHeader или OrderHeader, поэтому я попытался присоединиться и использовать 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. Я пробовал несколько разных способов и получаю ту же ошибку. Возможно ли это?

edit:

Вот модель примечания

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

1 Ответ

1 голос
/ 05 марта 2020

Вместо многократного объединения 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)
...