6

Sqlite-Net ORM を使用しており、次のような特定の条件に一致するテーブルからすべての行を削除したいと考えています。

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

エンティティまたは主キーのいずれかを取る削除メソッドがあります。もちろん、条件に一致するすべてのエンティティを取得し、エンティティごとに個別に削除を呼び出すことができますが、それは間違っていると感じています。

現在、私は使用しています

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

しかし、私はこのバージョンが好きではありません。クラスの名前を変更すると、ハードコードされた SQL が機能しなくなります。

私が見逃している他のオプションはありますか?

4

2 に答える 2

5

ソースを調べましたが、述語を使用して削除できる場所はどこにもありません。ただし、次の拡張メソッドは、探している機能を提供する必要があります。

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 クラスを使用することでこれがどの程度予測可能になるかはわかりません。現在、削除と更新を手動で行う必要があるのはそのためだと思います。したがって、自己責任でテストして使用してください:)

于 2014-02-26T22:53:10.550 に答える
0

クラス名のハードコーディングを避けたい場合は、conn.Execute("DELETE FROM " + typeof(T).Name + "...").

于 2017-01-23T15:10:56.993 に答える