這是the tutorial我下面來詳細表達式樹。表達如何寫string.Contains(someText)樹
我已經超過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,這就是我正在努力完成它:
這種私有方法:
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;
}
因爲它上面,它的工作就好了。但是,我甚至寫了這個方法的原因是隻能通過用戶選擇的列進行過濾。
我希望能夠基於是在UI中可見柱組成。
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)))
感謝您的幫助
雖然重複問同樣的事情,答案只有是問題的一部分,其上OP相當接近反正提供的信息。另一部分,將多個表達式組合成單個「OR」鏈的部分,不包括對重複問題的所有答案,包括已接受的答案。投票重新提出此問題,以解釋重複中缺失的部分。 – dasblinkenlight
@dasblinkenlight問題的兩個部分(現在是您的答案中的第三個關於嵌套屬性訪問器的註釋)是重複的並且已被回答。我剛剛選擇了與帖子標題相匹配的那個。一般來說,他們應該被問及(因此分開重複:)。 –