1

我正在使用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();

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

4

3 回答 3

3

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

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

或者手动进行:签出DynamicParameters

于 2014-12-24T09:11:35.770 回答
1

从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 调用

于 2014-12-23T03:59:46.463 回答
0

您可以将参数提取到类中

  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);
        }
于 2014-12-23T05:41:06.820 回答