我正在我的項目中進行常見查詢。我使用Expression來構建我的查詢樹,代碼列表如下:
public IList<Book> GetBooksFields(string fieldName, string fieldValue)
{
ParameterExpression paramLeft = Expression.Parameter(typeof(string), "m." + fieldName);
ParameterExpression paramRight = Expression.Parameter(typeof(string), "\"" + fieldValue + "\"");
ParameterExpression binaryLeft = Expression.Parameter(typeof(Book),"m");
BinaryExpression binaryExpr = Expression.Equal(paramLeft, paramRight);
var expr = Expression.Lambda<Func<Book, bool>>(binaryExpr, binaryLeft);
return bookRepository.GetMany(expr).ToList();
}
但是當我調用我的GetBooksFields
方法時,它會拋出一個異常,如下所示:
我調試了expr變量並獲得了正確的表達式:{ m => (m.Name == "sdf")
},這就是我想要的,但我不知道為什麼我得到錯誤,thx。
你不能通過將點插入變量名來“欺騙”LINQ將參數解釋為成員表達式。
你必須正確構造表達式樹,如下所示(編輯:根據你的評論將字段更改為屬性):
public IList<Book> GetBooksFields(string propertyName, string propertyValue)
{
var parameter = Expression.Parameter(typeof(Book), "book");
var left = Expression.Property(parameter, propertyName);
var convertedValue = Convert.ChangeType
(
propertyValue,
typeof(Book).GetProperty(propertyName).PropertyType
);
var right = Expression.Constant(convertedValue);
var binaryExpr = Expression.Equal(left, right);
var expr = Expression.Lambda<Func<Book, bool>>(binaryExpr, parameter);
return bookRepository.GetMany(expr).ToList();
}