私は次のコードを持っています:
var existing = new[] { "first", "second" };
Func<TestType, string> func = type => type.TextCol;
Expression<Func<TestType, bool>> exp = q => existing.Contains(func(q));
式ビジターがあります。ビジターはMethodCallExpression
どちらがContains
元の式に含まれているかを確認し、2 つのパラメーターがあります。1 つは文字列値の配列で、2 番目は元の式の一部でInvocationExpression
あるです。func(q)
InvocationExpression
どうにかして、元の関数で使用されているプロパティ名を抽出する必要があります。それは可能だと思いInvocationExpression
ますが、デバッガーでインスタンスを見ると、どうすればよいかわかりません。誰かが助けてくれるでしょうか?
アップデート
私がやろうとしていることは
public IEnumerable<TEntity> FindExisting<TEntity, TValue>(IEnumerable<TEntity> list, Func<TEntity, TValue> property)
{
var values = list.Select(property);
Expression<Func<TEntity, bool>> exp = q => list.Contains(property(q));
return db.Select<TEntity>(exp);
}
更新 2
全体の話:)したがって、 ServiceStack.OrmLite にはメソッドSaveAllがあり、エンティティのリストを取得し、それらのどれが存在するかをデータベースでチェックして更新し、残りが挿入されます。問題は、Idフィールドを使用してアイテムがデータベースに存在するかどうかを確認していることです。私の場合、外部システムの主キーである別の一意のフィールドがあり、外部システムからエンティティを取得するときに、それらを挿入または更新する必要があるかどうかを確認するには、Id ではなくそのフィールドを使用する方がはるかに簡単です。私は、SaveAll と同じことを行う拡張メソッドを作成しようと考えましたが、アイテムを更新または挿入する必要があるかどうかを判断するために使用されるプロパティを渡す可能性があります。