如何构建匿名参数数组

我有一个疑问

string sQuery = string.Format("SELECT {0} FROM vwweb_Orders WHERE CustFID = ?", columns);

在这里执行

var result = await conn.QueryAsync<Order>(sQuery, new { ID = Custid });

但是假设我正在根据用户选择的参数进行搜索。我可以构建 where 子句,但如何构建匿名数组呢?

new { ID = Custid }

我想要类似的东西

var params = new {};
if (!String.IsNullOrWhiteSpace(username)) {
   params += {username}
}


繁星coding
浏览 61回答 2
2回答

智慧大石

如果您确实想要像匿名类型一样具有参数,则可以使用ExpandoObject:-dynamic params = new ExpandoObject();if (!string.IsNullOrWhiteSpace(username)) {&nbsp; &nbsp; params.Username = username;}或者,如果您想要一个数组(并且您事先不知道长度),请使用List<string>:-var paramlist = new List<string>();if (!string.IsNullOrWhiteSpace(username)) {&nbsp; &nbsp; paramlist.Add("username");}var params = paramlist.ToArray();但是,如果您正在构造WHERE子句,则无论如何,您的 SQL 语句中将始终具有固定数量的参数(或者您也必须动态构造它)。动态构建过滤查询时可以使用的另一种方法是:-SELECT *FROM vwweb_OrdersWHERE 1=1AND (@custid IS NULL OR CustFID = @custid)AND (@xyz IS NULL OR XYZ = @xyz)-- etc然后向您的调用提供所有参数QueryAsync,如果有任何参数为空,则它们将在WHERE子句中被跳过。

慕尼黑的夜晚无繁华

也许您可以编写查询来首先检查空/空/非零值,否则按如下方式评估实际值:public async Task<List<Order>> Execute(OrderQuery query){&nbsp; &nbsp; var sql = $@"SELECT&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ...&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FROM vwweb_Orders&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WHERE @{nameof(query.CustomerId)} <= 0 OR customer_id = @{nameof(query.CustomerId)}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AND ISNULL(@{nameof(query.CustomerName)}, '') = '' OR customer_name = @{nameof(query.CustomerName)}";&nbsp; &nbsp; return await conn.QueryAsync<Order>(sql, new { query.CustomerId, query.CustomerName});}public class OrderQuery{&nbsp; &nbsp; public int CustomerId { get; set; }&nbsp; &nbsp; public string CustomerName { get; set; }}public class Order{}
打开App,查看更多内容
随时随地看视频慕课网APP