ASP.NETMVCで動的検索画面を作成しました。ビューにすべてのフィールドを表示する代わりに、ユーザーが検索するフィールドを選択できるように、リフレクションを介してエンティティからフィールド名を取得しました。
検索結果がコントローラーにポストバックされると、FieldNameとValueを含むFormCollectionを受け取ります。検索されているフィールドの数がわかりません。FormCollectionには、ユーザーが選択したフィールドのみが含まれています。
たとえば、データベースにクエリを実行するときに、そのフィールド名を取得してLINQステートメントに適用できるようにしたいと思います。
public List<People> SearchPeople(Dictionary<string, string> fieldValueDictionary)
{
List<People> searchResults = new List<People>();
foreach (string key in fieldValueDictionary.Keys)
{
searchResults.Add(entities.People.Where(p => p.<use the key string as the fieldName> == fieldValueDictionary[key]));
}
return searchResults;
}
「キー文字列をfieldNameとして使用する」場合、p => p.FirstName == fieldValueDictionary [key] where key="FirstName"のようになります。Lambda式ツリーを使用しようとして失敗しましたが、DynamicLINQで少し成功しました。他の唯一の選択肢は、次のようなことを行うことです。
public List<People> SearchPeople(Dictionary<string, string> fieldValueDictionary)
{
IQueryable<People> results = entities.People;
foreach (string key in fieldValueDictionary.Keys)
{
switch (k)
{
case "FirstName": results = results.Where(entities.People.Where(p => p.FirstName == k);
case "LastName": results = results.Where(entities.People.Where(p => p.LastName == k);
// Repeat for all 26 fields in table
}
}
return results.ToList<People>();
}
更新:次の投稿を通じてラムダ式ツリーの調査を行いました:
ラムダ式を動的に作成+linq+ OrderByDescending
LINQ:ラムダ式をパラメーターとして渡し、メソッドによって実行および返される
ラムダを取得して次のように出力するところまで到達しました: "p => p.FirstName"ですが、これをwhereで機能させることはできません。助言がありますか?私のコードは以下の通りです:
MemberInfo member = typeof(People).GetProperty("FirstName");
ParameterExpression cParam = Expression.Parameter(typeof(People), "p");
Expression body = Expression.MakeMemberAccess(cParam, member);
var lambda = Expression.Lambda(body, cParam);