gpt4 book ai didi

c# - 有没有办法使用谓词在 Sqlite-Net 中删除?

转载 作者:太空狗 更新时间:2023-10-29 21:39:29 26 4
gpt4 key购买 nike

我正在使用 Sqlite-Net ORM 并想从表中删除所有符合特定条件的行,例如:

conn.Table<MyEntity>().Delete(t => t.someProperty == someValue);

有些删除方法采用实体或主键。我现在当然可以获取所有符合我的条件的实体,然后分别为每个实体调用 delete,但感觉不对。

目前我正在使用

conn.Execute("DELETE FROM MyEntitiy...")

但是我不喜欢这个版本。如果我重命名我的类,硬编码的 SQL 将不再起作用。

还有其他我错过的选择吗?

最佳答案

我查看了源代码,没有看到任何可以使用谓词删除的地方。但是,以下扩展方法应该提供您正在寻找的功能:

using System.Linq.Expressions;
using SQLite;
using System.Collections.Generic;

public static class DeleteExtensions
{
public static int Delete<T>(this TableQuery<T> tableQuery, Expression<Func<T, bool>> predExpr)
{
BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;
Type type = tableQuery.GetType();
MethodInfo method = type.GetMethod("CompileExpr", flags);

if (predExpr.NodeType == ExpressionType.Lambda) {
var lambda = (LambdaExpression)predExpr;
var pred = lambda.Body;

var args = new List<object> ();

var w = method.Invoke(tableQuery, new object[] {pred, args});
var compileResultType = w.GetType();
var prop = compileResultType.GetProperty("CommandText");
string commandText = prop.GetValue(w, null).ToString();

var cmdText = "delete from \"" + tableQuery.Table.TableName + "\"";
cmdText += " where " + commandText;
var command = tableQuery.Connection.CreateCommand (cmdText, args.ToArray ());

int result = command.ExecuteNonQuery();
return result;
} else {
throw new NotSupportedException ("Must be a predicate");
}
}
}

但是,我不确定通过使用 TableQuery 类这将是多么可预测,我认为这就是为什么您当前被迫手动执行删除和更新的原因。所以测试和使用风险自负:)

关于c# - 有没有办法使用谓词在 Sqlite-Net 中删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21123170/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com