OrmLite通过多列联接表

时间:2020-03-05 03:40:05

标签: servicestack ormlite-servicestack

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

1 个答案:

答案 0 :(得分:2)

将条件移至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)
相关问题