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 はクエリを検査し、明らかに不要なものを判断して削除します。クエリで言及されているパラメータのみを送信します。したがって、 が必要なクエリ、 が必要なクエリ、両方が必要なクエリ、両方が必要なクエリ、不要なクエリがある場合は、次のようにします@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 });

購入日については、両方のパラメーターを 1 つの 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 に答える