私たちのこの巨大なプロジェクトのために、より精巧なフィルタリングシステムを作成中です。主要な述語の1つは、文字列パラメータを介して比較を渡すことができることです。 "> 50" または "5-10" または "< 123.2"ラムダ式を比較して返す拡張メソッド
私は(説明するための例のように)持って何
のViewModel:
TotalCost (string) (value: "<50")
Required (string) (value: "5-10")
EFこれは、次の形式で表現しますモデル:私が使用したい
TotalCost (double)
Required(double)
式:
model => model.Where(field => field.TotalCost.Compare(viewModel.TotalCost) && field.Required.Compare(viewModel.Required));
私は受け取りたい
式:
model => model.Where(field => field.TotalCost < 50 && field.Required > 5 && field.Required < 10);
か、その
に似て何かしかし...私はどこから始めれば見当がつかない。私はそれを絞り込んだ
public static Expression Compare<T>(this Expression<Func<T, bool>> value, string compare)
これは正しくないかもしれませんが、これは私が持っているすべてです。比較ビルダーは問題ではない、それは簡単なビットです。難しい部分は実際に式を返しています。私は、式を関数値として返すことを試みたことはありません。ですから、基本的に私が保つ必要があるのは、フィールドであり、比較式を返します。
助けが必要ですか? :X
アップデート:この可哀想
は私の問題を解決していません。それは、私が過去23時間にわたって起きてきたことが原因かもしれませんが、私はそれを拡張方法にする方法には少しも手がかりがありません。それは、「欠けている
public static Expression<Func<decimal, bool>> Compare(string arg)
{
if (arg.Contains("<"))
return d => d < int.Parse(arg);
return d => d > int.Parse(arg);
}
私はその関数(おそらく完全に間違っを)出し形
var ex = new ExTest();
var items = ex.Repo.Items.Where(x => x.Cost.Compare("<50"));
方法がある:私が言ったように、私が好きなものを...記述する方法は基本的にあり最初の場所で比較するための「これは何か」という価値がありますが、私は式の入力を得る方法をまだ理解していません... ReSharperについては、代わりにブール値に変換することを提案します...
私の頭は今では毛羽立ちます...
アップデート2:
私は、コンソールアプリケーションのメモリ・リポジトリで動作するコードの部分を持ってする方法を見つけ出すことができました。私はまだエンティティフレームワークでそれを試しています。
public static bool Compare(this double val, string arg)
{
var arg2 = arg.Replace("<", "").Replace(">", "");
if (arg.Contains("<"))
return val < double.Parse(arg2);
return val > double.Parse(arg2);
}
しかし、私は非常にそれは私が更新3
後だ何を疑う:
右は、最後の答えの前に、再び座っやラムダ式を見た後、私が来ました以下のようなものでは、それは "Compare()"の正確な要件を満たしていませんが、それは 'オーバーロード - ish'ですメソッド:
public static IQueryable<T> WhereExpression<T>(this IQueryable<T> queryable, Expression<Func<T, double>> predicate, string arg)
{
var lambda =
Expression.Lambda<Func<T, bool>>(Expression.LessThan(predicate.Body, Expression.Constant(double.Parse(50.ToString()))));
return queryable.Where(lambda);
}
はしかし、私の目にもかかわらず、すべてが論理見せかけ、私はの実行時例外を取得:
System.ArgumentException was unhandled
Message=Incorrect number of parameters supplied for lambda declaration
Source=System.Core
StackTrace:
at System.Linq.Expressions.Expression.ValidateLambdaArgs(Type delegateType, Expression& body, ReadOnlyCollection`1 parameters)
at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, String name, Boolean tailCall, IEnumerable`1 parameters)
at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, Boolean tailCall, IEnumerable`1 parameters)
at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, ParameterExpression[] parameters)
これは明らかに犯人ラインであること:
var lambda =
Expression.Lambda<Func<T, bool>>(Expression.LessThan(predicate.Body, Expression.Constant(double.Parse(50.ToString()))));
私は解決策に非常に近いです。私の背中からそのエラーを取り除くことができれば、私はEFがそれをSQLに変換できるはずだと信じています。さもなければ...まあ、最後の応答はおそらく行くでしょう。
私が思うに提供するように式を作成します。 試しましたか? –
うん、ちょうどやった。私はtbhと思ったでしょう。 – NeroS