使用LINQ的自定义投影操作员

时间:2014-12-10 11:33:03

标签: c# linq design-patterns entity-framework-6

我们已经创建了自定义存储库类来检索实体框架上下文的对象。 Get方法总是返回整个对象。

我希望包含项目运算符Select as parameter。这样我们就可以从外面传递出需要选择的东西。 SQL查询会更有效率。它可行吗?

public class GenericRepository<TEntity> where TEntity : class
{
    internal DbContext context;        
    public IEnumerable<TEntity> Get(
        Expression<Func<TEntity, bool>> filter = null,
        Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null)
    {
        IQueryable<TEntity> query = dbSet;

        if (filter != null)
        {
            query = query.Where(filter);
        }
        if (orderBy != null)
        {
            return orderBy(query).ToList();
        }
        else
        {
            return query.ToList();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

params Expression<Func<T, object>>[] properties参数(属性选择器)添加到执行查询的方法中,其中T是您的实体的类型。接下来调用以下方法来获取有关每个属性的信息

private static PropertyInfo ResolveProperty<T>(Expression<Func<T, object>> property) where T : class
    {
        MemberExpression member;

        UnaryExpression body = property.Body as UnaryExpression;
        if (body != null)
        {
            member = (MemberExpression)body.Operand;
        }
        else
        {
            member = (MemberExpression)property.Body;
        }

        PropertyInfo info = (PropertyInfo)(member).Member;
        return info;
    }

现在,当您获得有关属性的信息时,您可以继续自定义实施或使用System.Linq.Dynamic

https://dynamiclinq.codeplex.com/