从linq扩展方法中的表达式中获取值

时间:2013-07-25 17:28:19

标签: c# .net linq asp.net-mvc-4 expression

我搜索了整个互联网并尝试了很多东西,但我无法从我的表达中获得价值。如果有人能帮助我,那将是非常酷的......

再见 马库斯

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);

- 编辑结束

2 个答案:

答案 0 :(得分:0)

哇,整个互联网!那肯定需要一段时间! :)

您编译的表达式现在希望获取类型为T的对象并返回int类型的值。

我想你想要枚举source并将method应用到它。

例如:

foreach (T item in source)
{ 
    yield return method(item);
}

但我认为更好的问题是 - 你打算如何使用这种方法?你确定表达式是你需要的吗?

答案 1 :(得分:0)

最简单的解决方案是:

return source.Select(expression);

但话又说回来,如果那是你真正想做的事情,你根本不需要自己编写GetFilteredByStatusList