Search code examples
c#sql-serverormlite-servicestack

Complex JOIN with ServiceStack OrmLite


How can I express the query below (from this question):

SELECT c.*, p1.*
FROM customer c
JOIN purchase p1 ON (c.id = p1.customer_id)
LEFT OUTER JOIN purchase p2 ON (c.id = p2.customer_id AND 
    (p1.date < p2.date OR p1.date = p2.date AND p1.id < p2.id))
WHERE p2.id IS NULL;

Using OrmLite Select and Join API?


Solution

  • Unfortunately your mutli tables self table join is too complex to be expressed in OrmLite's Typed API so you'll need to drop down to Custom SQL, e.g:

    var results = db.Select<Tuple<Customer,Purchase>>(@"SELECT c.*, 0 EOT, p1.*
        FROM customer c
        JOIN purchase p1 ON (c.id = p1.customer_id)
        LEFT OUTER JOIN purchase p2 ON (c.id = p2.customer_id AND 
            (p1.date < p2.date OR p1.date = p2.date AND p1.id < p2.id))
        WHERE p2.id IS NULL;");
    
    results.PrintDump();
    

    I've created a Live Example of this you can play with on Gistlyn.