Question

Background

I'm attempting to use ServiceStack.OrmLite to grab some values (so I can cache them to run some processing against them).

I need to grab a combination of three values, and I have a custom SQL statement that will yield them (does the joins, etc.)

Because this will be a large list of combinations, I'd like to pass in some lists of values and use Sql.In to filter to only the results that have those values.

Specifics

I need to check whether an invoice is unique to a firm and another value (called ClaimLawsuitID here).

so have my poco:

public class FirmIDClaimLawsuitIDInvoiceNumberCombination
{
    public string FirmID { get; set; }
    public string ClaimLawsuitID { get; set; }
    public string InvoiceNumber { get; set; }
}

and I have my SQL statement:

select tblDefenseInvoice.FirmID, tblDefInvClaimantDetail.ClaimLawsuitID, tblDefInvClaimantDetail.invoiceNumber 
    from tblDefenseInvoice
    inner join tblDefInvClaimantDetail
        on(tblDefenseInvoice.DefenseInvoiceID = tblDefInvClaimantDetail.DefenseInvoiceID)

I would like to run the following:

 public List<FirmIDClaimLawsuitIDInvoiceNumberCombination> GetFirmIDClaimLawsuitIDInvoiceNumberCombinationsForExistingItems(IEnumerable<int> firmIds, IEnumerable<long> claimLawsuitIDs, IEnumerable<string> invoiceNumbers)
 {
     var sql = @"select tblDefenseInvoice.FirmID, tblDefInvClaimantDetail.ClaimLawsuitID, tblDefInvClaimantDetail.invoiceNumber 
            from tblDefenseInvoice
            inner join tblDefInvClaimantDetail
                on(tblDefenseInvoice.DefenseInvoiceID = tblDefInvClaimantDetail.DefenseInvoiceID)";

    var ev = OrmLiteConfig.DialectProvider.ExpressionVisitor<tblClaimLawsuit>();
    var firmFilter = PredicateBuilder.True<tblDefenseInvoice>();
    var claimLawsuitFilter = PredicateBuilder.True<tblDefInvClaimantDetail>();
    var invoiceNumberFilter = PredicateBuilder.True<tblDefInvClaimantDetail>();

    firmFilter = x => Sql.In(x.FirmID, firmIds);
    claimLawsuitFilter = x => Sql.In(x.ClaimLawsuitID, claimLawsuitIDs);
    invoiceNumberFilter = x => Sql.In(x.InvoiceNumber, invoiceNumbers);
    ev.Select(sql);
    ev.Where(firmFilter);
    ev.Where(claimLawsuitFilter);
    ev.Where(invoiceNumberFilter);

    return dal.DB.Select<FirmIDClaimLawsuitIDInvoiceNumberCombination>(ev.ToSelectStatement());

 }

Question

  • Is this possible to achieve this way?
  • Is there some other way of achieving this within ServiceStack's OrmLite that is cleaner and I'm unaware of?
Was it helpful?

Solution

Since I was selecting to a POCO, I simply needed to add the filters based on that POCO.

The following worked just fine:

public List<FirmIDClaimLawsuitIDInvoiceNumberCombination>
    GetFirmIDClaimLawsuitIDInvoiceNumberCombinationsForExistingItems(
    IEnumerable<long> firmIds,
    IEnumerable<long> claimLawsuitIDs)
{
    var sql = @"select tblDefenseInvoice.FirmID, tblDefInvClaimantDetail.ClaimLawsuitID, tblDefInvClaimantDetail.invoiceNumber 
            from tblDefenseInvoice
            inner join tblDefInvClaimantDetail
                on(tblDefenseInvoice.DefenseInvoiceID = tblDefInvClaimantDetail.DefenseInvoiceID)";

    var ev = OrmLiteConfig.DialectProvider.ExpressionVisitor<FirmIDClaimLawsuitIDInvoiceNumberCombination>();
    var firmFilter = PredicateBuilder.True<FirmIDClaimLawsuitIDInvoiceNumberCombination>();
    var claimLawsuitFilter = PredicateBuilder.True<FirmIDClaimLawsuitIDInvoiceNumberCombination>();

    firmFilter = x => Sql.In(x.FirmID, firmIds);
    claimLawsuitFilter = x => Sql.In(x.ClaimLawsuitID, claimLawsuitIDs);
    ev.Select(sql);
    ev.Where(firmFilter);
    ev.Where(claimLawsuitFilter);

    return dal.DB.Select<FirmIDClaimLawsuitIDInvoiceNumberCombination>(ev.ToSelectStatement());
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top