Tôi nhận được ngoại lệ này khi tôi chạy mã này.Gọi hàm Lambda động
ParameterExpression loại
System.Int64
không thể được sử dụng cho tham số đại biểu của loạiSystem.Object
Tôi biết nó là cái gì để làm với Expression.Lambda<func<object,bool>>
một phần của mã. Nói chung, tôi muốn vượt qua bất kỳ loại ParameterExpression
vào phương pháp này và nó sẽ gọi biểu thức.
public static IQueryable<T> OrderData<T>(IQueryable<T> data)
{
try
{
Order order = Order.ASC;
var result = Enum.TryParse<Order>(_gridSettings.SortOrder, true, out order);
if (_gridSettings.IsSearch)
{
data = ExpressionSort(order, data, typeof(T).GetProperty(_gridSettings.SortColumn));
}
else
{
data = ExpressionSort(order, data, _defaultColumn);
}
}
catch (Exception ex)
{
log.WriteLog(MethodBase.GetCurrentMethod(), LogLevel.FATAL, ex);
}
return data;
}
private static IQueryable<T> ExpressionSort<T>(Order order, IQueryable<T> data, PropertyInfo property)
{
// Compose the expression tree that represents the parameter to the predicate.
ParameterExpression paramExpression = Expression.Parameter(property.PropertyType, property.Name);
IQueryable<T> queryableData = data.AsQueryable<T>();
switch (order)
{
case Order.ASC:
return ExecuteCall(paramExpression, paramExpression, queryableData, "OrderBy");
case Order.DESC:
return ExecuteCall(paramExpression, paramExpression, queryableData, "OrderByDescending");
}
return data;
}
private static IQueryable<T> ExecuteCall<T>(Expression expression, ParameterExpression paramExpression, IQueryable<T> queryableData, string linqMethod)
{
MethodCallExpression callExpression = Expression.Call(
typeof(Queryable),
linqMethod,
new Type[] { queryableData.ElementType },
queryableData.Expression,
Expression.Lambda<Func<object, bool>>(expression, new ParameterExpression[] { paramExpression }));
// Create an executable query from the expression tree.
return queryableData.Provider.CreateQuery<T>(callExpression);
}
EDIT: tôi đã thấy câu trả lời này cho một câu hỏi tương tự
Expression of type 'System.Int32' cannot be used for return type 'System.Object' Tôi không biết làm thế nào để áp dụng nó vào mã của tôi mặc dù
EDIT 2: Các vấn đề chính là dòng Expression.Lambda<Func<object, bool>>(conversion, new ParameterExpression[] { paramExpression }));
này đang cho tôi một ngoại lệ. paramExpression chứa Int64 nhưng nó là một đối tượng. Tôi không biết làm thế nào để tự động nói với Func từ thông tin tôi đã có hoặc nếu điều đó là có thể.
MỤC TIÊU: Tôi cố gắng để làm một cái gì đó như thế này data.OrderBy(x=>x.DynamicProperty);
Bạn đang sử dụng T
Bạn có thể gửi một ví dụ về cách bạn đang sử dụng này, vì nó đứng ngay hiện nay? Nếu không có thì thật khó để đánh giá cách khắc phục nó. –
Tôi đã đăng phương thức gọi hai phương thức còn lại. Không có gì cao hơn bây giờ chỉ vì nó không hoạt động được nêu ra. Dữ liệu 'IQueryable' sẽ giống như thế này 'Danh sách dữ liệu' @EBrown –
imGreg