我在ASP.NET MVC中创建了一个动态搜索屏幕。我通过反射从实体中检索字段名称,以便我可以允许用户选择要搜索的字段而不是显示视图中的所有字段。使用Dyanmic字段名称查询LINQ的实体
当搜索结果回发给控制器时,我收到一个包含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;
}
在那里我有“使用密钥字符串作为字段名”吧会像p => p.FirstName == fieldValueDictionary [key]其中key =“FirstName”。我尝试过并且未能使用Lambda Expression Trees,并且在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>();
}
更新:我已经通过以下职位进行研究Lambda表达式树:
dynamically create lambdas expressions + linq + OrderByDescending
Parameter problem with Expression.Lambda()
LINQ: Passing lambda expression as parameter to be executed and returned by method
我收到了就像获得一个lambda来输出以下内容:“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);
如果你想这样的动态行为,我真的觉得你会需要去学习如何去爱表达式树。 – 2010-08-11 22:51:53