【问题标题】:ServiceStack.ORMLite: Custom query to custom Poco with Sql.In selections?ServiceStack.ORMLite:使用 Sql.In 选择自定义 Poco 的自定义查询?
【发布时间】:2014-03-20 15:38:48
【问题描述】:

背景

我正在尝试使用 ServiceStack.OrmLite 来获取一些值(这样我就可以缓存它们以对它们进行一些处理)。

我需要获取三个值的组合,并且我有一个自定义 SQL 语句可以生成它们(是否进行连接等)

因为这将是一个很大的组合列表,所以我想传入一些值列表并使用 Sql.In 过滤到只有具有这些值的结果。

细节

我需要检查发票是否是公司独有的以及另一个值(此处称为 ClaimLawsuitID)。

我的 poco 也是如此:

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

我有我的 SQL 语句:

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

我想运行以下命令:

 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());

 }

问题

  • 这样可以实现吗?
  • 在 ServiceStack 的 OrmLite 中是否有其他方法可以实现这一点,而且我不知道吗?

【问题讨论】:

    标签: sql sql-server database ormlite-servicestack


    【解决方案1】:

    由于我选择的是 POCO,我只需要添加基于该 POCO 的过滤器。

    以下工作正常:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-19
      • 2022-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多