【问题标题】:How to add values for searching dynamically in Dapper.NET如何在 Dapper.NET 中添加动态搜索值
【发布时间】:2014-12-23 02:53:42
【问题描述】:

我正在使用Dapper.NET 开发采购订单搜索功能。用户可以通过发票编号和购买日期进行搜索。

如果用户在文本框中填写发票编号,它将按发票编号搜索,
如果用户填写发票编号和购买日期,它将根据发票编号和购买日期进行搜索,
如果用户填写购买日期,它将按购买日期搜索

所以,查询:

string query = "SELECT PurchaseDate, InvoiceNo, Supplier, Total FROM PurchaseOrder WHERE 1 = 1";

if (!string.IsNullOrEmpty(purchaseOrder.InvoiceNo))
{
    query += " AND InvoiceNo = @InvoiceNo";
}
if (purchaseOrder.PurchaseDate != DateTime.MinValue)
{
    query += " AND PurchaseDate = @PurchaseDate";
}

return this._db.Query<PurchaseOrder>(sql, ?).ToList();

问题是我不知道如何根据查询中的条件数量动态传递值。

【问题讨论】:

标签: c# dapper micro-orm


【解决方案1】:

简单的选择:包括所有的东西! Dapper 将检查查询并决定哪些 显然 是不需要的,然后删除它们 - 只发送它可以在查询中找到的参数。所以如果有些查询需要@foo,有些需要@bar,有些需要两者,有些不需要,那么只需:

int foo = ...
string bar = ...
...Query<ResultType>(sql, new { foo, bar })...

或者手动操作:查看DynamicParameters

【讨论】:

    【解决方案2】:

    https://github.com/StackExchange/dapper-dot-net

     string query = "SELECT PurchaseDate, InvoiceNo, Supplier, Total FROM PurchaseOrder     WHERE 1 = 1";
    
     if (!string.IsNullOrEmpty(purchaseOrder.InvoiceNo))
     {
         sql += " AND InvoiceNo = @InvoiceNo";
     }
     if (purchaseOrder.PurchaseDate != DateTime.MinValue)
     {
        sql += " AND PurchaseDate = @PurchaseDate";
     }
    
    
      return this._db.Query<PurchaseOrder>(sql, new {InvoiceNo = new DbString { Value =     YourInvoiceNoVariable, IsFixedLength = true, Length = 10, IsAnsi = true });
    

    对于购买日期,您需要决定是在一个 sql 语句中包含这两个参数还是为每个参数创建一个单独的 _db.Query 调用

    【讨论】:

    • 我想要的是灵活性,如果用户只填写发票编号然后按发票编号搜索,如果用户填写发票编号和购买日期然后按发票编号和购买日期搜索。在我的代码中,我可以使查询灵活,但不能使用值。
    • 我可以为每个条件创建单独的_db.Query调用,但是会根据条件重复代码SELECT PurchaseDate, InvoiceNo, Supplier, Total FROM PurchaseOrder
    • 您需要传递这两个参数然后处理 sql 查询中的检查。类似于 WHEN fieldname is null THEN ... 看到这个链接stackoverflow.com/questions/5751038/…
    • 我明白了,我认为查询变得更复杂了对吧?如果我无法传递查询之类的值,那么我将创建一个单独的 _db.Query,谢谢
    【解决方案3】:

    您可以将参数提取到类中

      public class Filter
        {
            public string InvoiceNo { get; set; }
            public DateTime PurchaseDate { get; set; }
        }
    

    所以,将过滤器作为参数发送

    public IEnumerable<PurchaseOrder> Find(Filter filter)
            {
                string query = "SELECT PurchaseDate, InvoiceNo, Supplier, Total FROM PurchaseOrder WHERE 1 = 1";
    
                if (!string.IsNullOrEmpty(purchaseOrder.InvoiceNo))
                {
                    query += " AND InvoiceNo = @InvoiceNo";
                }
                if (purchaseOrder.PurchaseDate != DateTime.MinValue)
                {
                    query += " AND PurchaseDate = @PurchaseDate";
                }
    
                return this._db.Query<PurchaseOrder>(sql, filter);
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      相关资源
      最近更新 更多