从linq扩展方法中的表达式获取值
本文关键字:表达式 获取 linq 扩展 方法 | 更新日期: 2023-09-27 18:24:52
我搜索了整个互联网,尝试了很多东西,但我无法从我的表达式中获得值。如果有人能帮我那就太酷了…
再见Markus
public static class LinqExtension
{
public static IQueryable<T> GetFilteredByStatusList<T>(this IQueryable<T> source, Expression<Func<T, int>> expression)
{
// So I can compile the expression.
// In some posts I have found, that I have to call the compiled method, but the method needs the T object.
// I have no idea how to acces the value of T.
Func<T, int> method = expression.Compile();
//EDIT
// Here I need the int value to pass it in a service method like:
// Service.GetStatusById("int value from expression");
//EDIT END
return source;
}
}
--编辑我有一个查询,在这个查询中,我必须调用一个方法,该方法需要来自当前查询项的动态值。这个方法已经存在,我在通过查询的for循环执行查询后使用它,并在这个循环中的每个项上调用这个方法。但我认为这不是一个很快的解决方案。
所以我在查询中调用这个方法,这就是为什么我尝试用扩展方法来实现它。
遵循扩展方法调用:
return query = query
.Join(entities.tblTaskgroupGlobal, x => x.lngAssignMain_id, y => y.id, (x, y) => new { x = x, y = y })
.WhereIf(taskFilterModel.StatusFilterList.Count() > 0, xy => taskFilterModel.StatusFilterList.Contains(xy.y.lngConstantStatus_id))
.GetFilteredByStatusList(xy => xy.x.lngAssignMain_id)
.Select(xy => xy.x);
--编辑结束
哇,整个互联网!那一定花了一段时间!:)
您编译的表达式现在期望获得一个T类型的对象,并返回一个int类型的值。
我想你想枚举source
并将你的method
应用于它。
例如:
foreach (T item in source)
{
yield return method(item);
}
但我认为更好的问题是——你打算如何使用这种方法?你确定表达式是你需要的吗?
最简单的解决方案是:
返回源。选择(表达式);
但话说回来,如果这是你真正想做的,你根本不需要写自己的GetFilteredByStatusList
。