Я создал экран динамического поиска в ASP.NET MVC. Я получил имена полей от объекта посредством отражения, чтобы позволить пользователю выбирать, какие поля он хочет искать, вместо отображения всех полей в представлении.
Когда результат поиска отправляется обратно в контроллер, я получаю FormCollection, содержащую FieldName и значение. Я не знаю, сколько полей ищется, и 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] где key = "FirstName". Я пытался и не смог использовать деревья лямбда-выражений, и добился небольшого успеха с Dynamic LINQ. Единственная альтернатива - сделать что-то вроде:
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
Проблема параметров с Expression.Lambda ()
LINQ: передача лямбда-выражения в качестве параметра, который должен быть выполнен и возвращен методом
Я получил лямбду для вывода следующего: "p => p.FirstName", но я не могу заставить это работать где-то. Какие-либо предложения? Мой код ниже:
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);