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

有没有办法将简洁的查询添加到列表中并执行全部?

有没有办法将简洁的查询添加到列表中并执行全部?

C#
www说 2023-09-09 17:03:57
我正在使用 Dapper 对数据库执行查询。我想知道是否有一种方法可以创建一个包含多个方法的列表,并通过循环它们来执行它们。我包括两种显示我正在使用的查询的方法。我有另一种方法连接到数据库并在其中调用方法。private void DeleteCar(SqlConnection connection, string databaseName){    Console.WriteLine($@"Starting Delete for CarInfo for {databaseName}");    connection.Query($"DELETE FROM dbo.CarInfo WHERE ParentCarId IS NULL OR ParentDriverId IS NULL");}private void DeleteHouse(SqlConnection connection, string databaseName){    Console.WriteLine($@"Starting Delete for HouseInfo for {databaseName}");    connection.Query($"DELETE FROM dbo.HouseInfo WHERE ParentHouseId IS NULL OR ParentOwnerId IS NULL");}
查看完整描述

3 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

。当针对多个输入发出相同的查询时,通过传递 an作为参数对象, Dapper确实有一个IEnumerable<T>工具 - 它本质上是在内部展开它,就好像您依次foreach使用每个项目发出了一个 - 但对于不同的查询:不,只需将它们一个接一个地发出即可。



查看完整回答
反对 回复 2023-09-09
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

您可以为每个方法创建一个操作,但操作需要具有相同的原型(参数)。一个动作相当于一个指向函数的指针。为了简单起见,这里我使用 lambda 初始化操作。


一旦你有了一系列的动作,你就可以循环遍历它并一一调用它们。


    var methods = new List<Action<SqlConnection, string>>

    {

        (connection,databaseName) => DeleteCar(connection, databaseName),

        (connection,databaseName) => DeleteHouse(connection, databaseName),

    };


    SqlConnection myDb;

    string dbName;


    foreach (var action in methods)

    {

        action(myDb, dbName);

    }

我还可以直接使用方法组初始化数组


    var methods = new List<Action<SqlConnection, string>>

    {

        DeleteCar,

        DeleteHouse,

    };

不同之处在于,对于方法组,您可以直接给出方法,而对于 lambda,您可以调整参数(例如始终给出相同的 dbName):


    string dbName = "toto"; 

    var methods = new List<Action<SqlConnection, string>>

    {

        (connection) => DeleteCar(connection, dbName),

        (connection) => DeleteHouse(connection, dbName),

    };


    SqlConnection myDb;


    foreach (var action in methods)

    {

        action(myDb);

    }


查看完整回答
反对 回复 2023-09-09
?
largeQ

TA贡献2039条经验 获得超7个赞

实际上,您可以在存储过程中使用表类型,因此在 C# 中您可以创建如下模型:


public class IntIdTableType

{

    public int Id { get; set; }

}

然后通过您的连接,您可以执行以下操作:


connection.QueryAsync<myViewModel>("[dbo].[spName]", param: new

    {

        ((List<IntIdTableType>)model.YourIListPropertyModel).ToDataTable(),

    }, commandType: CommandType.StoredProcedure);

然后在你的SQL中创建表类型


CREATE TYPE intHelper AS TABLE

    Id INT

)

最后在您的参数中的存储过程中:


    @MyIdTableType [intHelper] READONLY

询问:


    DELETE FROM dbo.HouseInfo WHERE ParentHouseId IS NULL OR ParentOwnerId IS NULL AND SomeColumn IN (@MyIdTableType)



查看完整回答
反对 回复 2023-09-09
  • 3 回答
  • 0 关注
  • 103 浏览

添加回答

举报

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