This is 教程 https://msdn.microsoft.com/en-us/library/bb882637(v=vs.110).aspx我正在学习表达式树。
我有超过 35 列要显示,但用户可以选择一次显示 10 列。因此,当用户在搜索框中输入某些内容时,我只想搜索用户可见的列。
SELECT FirstName, LastName, Address, ..., State
FROM Students
WHERE Id == @Id col1 AND (
FirstName LIKE '%@searchText%' OR
LastName LIKE '%@searchText%' OR
Address LIKE '%@searchText%' OR
...
State LIKE '%@searchText%')
回到 Linq,这就是我试图实现它的方式:
var result = db.Students
.Where(GetPredicate(id, listOfColumns))
.ToList();
这是私有方法:
private Expression<Func<Student, bool>> GetPredicate(int id, List<string> listOfColumns)
{
ParameterExpression pe = Expression.Parameter(typeof(Student), "s");
Expression left0 = Expression.Property(pe, "Id");
Expression right0 = Expression.Constant(id);
Expression e0 = Expression.Equal(left0, right0);
//Here ... omitted code because it's not working...
//
var expr = Expression.Lambda<Func<Student, bool>>(e0, new ParameterExpression[] { pe });
return expr;
}
正如上面所说,它工作得很好。但是,我编写此方法的原因是能够仅按用户选择的列进行过滤。
我希望能够根据用户界面中可见的列进行撰写。
if(!string.IsNullOrEmpty(searchText))
{
foreach (string columnName in columnList)
{
Expression col = Expression.Property(pe, columnName);
Expression left = Expression.Call(pe, typeof(string).GetMethod("Contains"));
Expression right = Expression.Constant(searchText);
Expression e = Expression.IsTrue(left, right);
}
}
我完全迷路了。我知道我需要访问字符串类的 Contains 方法,然后我不知道接下来要做什么。想法是得到这样的东西:
Where(d => d.Id == id && (d.FirstName.Contains(searchText)
|| d.LastName.Contains(searchText)
|| ...
|| d.State.Contains(searchText)))
感谢您的帮助