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

问题描述:

我使用SQLite-Net的ORM,想删除表中符合特定条件的所有行,如:有没有办法使用谓词在Sqlite-Net中删除?

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类,我以为你为什么正在*做的多数民众赞成手动删除和更新。因此,请自行承担风险:)

+1

这是一个部分的解决方案。它仍然留下'WHERE SomeHardcodedId = 5'的问题。 – Krumelur

+2

我已经用扩展方法更新了我的答案,该方法应该添加所需的功能。 – 3ullShark

+0

你应该向Sqlite.Net托管的Github回购贡献! – Krumelur

如果您只是希望避免在类名中进行硬编码,您可以使用conn.Execute("DELETE FROM " + typeof(T).Name + "...")

+0

这将无法正常工作,除非你的'class name'和你的'tablename'同名。例如,如果我的表叫''[Schema.TableName]' – user1