如何软编码Linq/EF查询

Sha*_*ica 3 c# linq entity-framework entity-framework-5

我想编写一个通用扩展方法,它将根据用户定义的过滤器返回一组指定的对象,其签名如下:

public static IEnumerable<T> GetObjects<T>(this ObjectSet<T> os, string fieldName, object value) where T : EntityObject {}
Run Code Online (Sandbox Code Playgroud)

当然,我们可以更改签名以处理多个过滤器,但让我们首先关注单场过滤器.

您如何编写执行此操作的Linq查询?

tuk*_*aef 6

您需要动态构建lambda-expression并Queryable.Where使用以下表达式调用os:

public static IQueryable<T> GetObjects<T>(this ObjectSet<T> os, 
                                          string fieldName, object value)
{
    var param = Expression.Parameter(typeof(T), "x");
    var body = Expression.Equal(
        Expression.PropertyOrField(param, fieldName), 
        Expression.Constant(value, value.GetType()));
    var lambda = Expression.Lambda<Func<T, bool>>(body, param);
    return os.Where(lambda);
}
Run Code Online (Sandbox Code Playgroud)