为了账号安全,请及时绑定邮箱和手机立即绑定

如何构建匿名参数数组

如何构建匿名参数数组

C#
繁星coding 2023-09-16 17:48:41
我有一个疑问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} }
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

如果您确实想要像匿名类型一样具有参数,则可以使用ExpandoObject:-


dynamic params = new ExpandoObject();


if (!string.IsNullOrWhiteSpace(username)) {

    params.Username = username;

}

或者,如果您想要一个数组(并且您事先不知道长度),请使用List<string>:-


var paramlist = new List<string>();


if (!string.IsNullOrWhiteSpace(username)) {

    paramlist.Add("username");

}


var params = paramlist.ToArray();

但是,如果您正在构造WHERE子句,则无论如何,您的 SQL 语句中将始终具有固定数量的参数(或者您也必须动态构造它)。


动态构建过滤查询时可以使用的另一种方法是:-


SELECT *

FROM vwweb_Orders

WHERE 1=1

AND (@custid IS NULL OR CustFID = @custid)

AND (@xyz IS NULL OR XYZ = @xyz)

-- etc

然后向您的调用提供所有参数QueryAsync,如果有任何参数为空,则它们将在WHERE子句中被跳过。


查看完整回答
反对 回复 2023-09-16
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

也许您可以编写查询来首先检查空/空/非零值,否则按如下方式评估实际值:


public async Task<List<Order>> Execute(OrderQuery query)

{


    var sql = $@"SELECT

                    ...

                FROM vwweb_Orders

                WHERE @{nameof(query.CustomerId)} <= 0 OR customer_id = @{nameof(query.CustomerId)}

                    AND ISNULL(@{nameof(query.CustomerName)}, '') = '' OR customer_name = @{nameof(query.CustomerName)}";


    return await conn.QueryAsync<Order>(sql, new { query.CustomerId, query.CustomerName});


}


public class OrderQuery

{

    public int CustomerId { get; set; }

    public string CustomerName { get; set; }

}


public class Order

{

}


查看完整回答
反对 回复 2023-09-16
  • 2 回答
  • 0 关注
  • 57 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信