使用 Dapper 删除列表<T>
Delete a List<T> using Dapper
使用 Dapper 或 Dapper.SimpleCRUD,如何从 table 中删除列表。类似于:
public static void DeleteList<T>(List<T> listToDelete)
{
using (var connection = OpenConnection())
{
connection.Delete<T>(listToDelete);
}
}
但是当我尝试这样做时,我得到...
The member of type DataModel.MyTable cannot be used as a parameter value
WHERE 子句中传递的唯一选项是什么?
我没有看到任何 Dapper 方法可以实现您想要实现的目标。唯一的选项是两个单一删除和两个多个删除。
public static int Delete<T>(this IDbConnection connection, int Id)
public static int Delete<T>(this IDbConnection connection, T entityToDelete)
public static int DeleteList<T>(this IDbConnection connection, object whereConditions, IDbTransaction transaction = null, int? commandTimeout = null)
public static int DeleteList<T>(this IDbConnection connection, string conditions, object parameters = null, IDbTransaction transaction = null, int? commandTimeout = null)
这两种多次删除都需要您传递条件或 where 子句。示例:
connection.DeleteList<User>(new { Age = 10 });
connection.DeleteList<User>("Where age > 20");
connection.DeleteList<User>("Where age > @Age", new {Age = 20});
Dapper 不了解您的实体;它不像 Entity Framework。您需要自己执行一个SQL命令或一个存储过程。
public static void DeleteList(List<int> idToDelete)
{
using (IDbConnection conn = new SqlConnection(connString))
{
conn.Open();
foreach (int id in idToDelete)
{
conn.Execute(@"DELETE FROM [User] WHERE Id = @Id", new {Id = id});
}
}
}
或Execute a Command multiple times
public static void DeleteList(List<int> idToDelete)
{
using (IDbConnection conn = new SqlConnection(connString))
{
conn.Open();
conn.Execute(@"DELETE FROM [User] WHERE Id = @Id",
idToDelete.Select(x => new { Id = x }).ToArray());
}
}
不确定为什么选择以上答案。但是开箱即用的 Dapper 不支持列表功能。而不是在我的回答中重新创建轮子,请参阅:Delete rows from mysql server from a list of ID's C#...只是我的 2c。
简单方法:
public void BulkDelete(IEnumerable<int> idList)
{
using (var connection = GetNewConnection())
{
connection.Execute("Delete FROM MY_TABLE WHERE Id in @idList", new { idList });
}
}
使用 Dapper 或 Dapper.SimpleCRUD,如何从 table 中删除列表。类似于:
public static void DeleteList<T>(List<T> listToDelete)
{
using (var connection = OpenConnection())
{
connection.Delete<T>(listToDelete);
}
}
但是当我尝试这样做时,我得到...
The member of type DataModel.MyTable cannot be used as a parameter value
WHERE 子句中传递的唯一选项是什么?
我没有看到任何 Dapper 方法可以实现您想要实现的目标。唯一的选项是两个单一删除和两个多个删除。
public static int Delete<T>(this IDbConnection connection, int Id)
public static int Delete<T>(this IDbConnection connection, T entityToDelete)
public static int DeleteList<T>(this IDbConnection connection, object whereConditions, IDbTransaction transaction = null, int? commandTimeout = null)
public static int DeleteList<T>(this IDbConnection connection, string conditions, object parameters = null, IDbTransaction transaction = null, int? commandTimeout = null)
这两种多次删除都需要您传递条件或 where 子句。示例:
connection.DeleteList<User>(new { Age = 10 });
connection.DeleteList<User>("Where age > 20");
connection.DeleteList<User>("Where age > @Age", new {Age = 20});
Dapper 不了解您的实体;它不像 Entity Framework。您需要自己执行一个SQL命令或一个存储过程。
public static void DeleteList(List<int> idToDelete)
{
using (IDbConnection conn = new SqlConnection(connString))
{
conn.Open();
foreach (int id in idToDelete)
{
conn.Execute(@"DELETE FROM [User] WHERE Id = @Id", new {Id = id});
}
}
}
或Execute a Command multiple times
public static void DeleteList(List<int> idToDelete)
{
using (IDbConnection conn = new SqlConnection(connString))
{
conn.Open();
conn.Execute(@"DELETE FROM [User] WHERE Id = @Id",
idToDelete.Select(x => new { Id = x }).ToArray());
}
}
不确定为什么选择以上答案。但是开箱即用的 Dapper 不支持列表功能。而不是在我的回答中重新创建轮子,请参阅:Delete rows from mysql server from a list of ID's C#...只是我的 2c。
简单方法:
public void BulkDelete(IEnumerable<int> idList)
{
using (var connection = GetNewConnection())
{
connection.Execute("Delete FROM MY_TABLE WHERE Id in @idList", new { idList });
}
}