有没有一种方法可以将Dapper查询添加到列表中并执行所有查询?

3
我正在使用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个回答

1

当针对多个输入参数发出相同查询时,Dapper确实提供了一种功能,通过将IEnumerable<T>作为参数对象传递,它在内部将其展开,就像您依次使用每个项目发出foreach一样。但是对于不同的查询:不,只需一个接一个地发出它们。


0

实际上,您可以在存储过程中使用表类型,在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)

0

你可以为每个方法创建一个操作,但这些操作需要具有相同的原型(参数)。一个操作等价于一个指向函数的指针。在这里,我使用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);
    }

在我看来,那似乎是一种过于复杂的调用两个方法的方式... - Marc Gravell
@marc-gravell确实很复杂。然而,由于问题涉及将方法放入列表中,我认为还有很多其他方法...无论如何,这更像是一个概念验证,而不是在现实生活中要做的事情。 - Bruno Belmondo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接