使用 LINQ 的自定义投影运算符

本文关键字:投影 运算符 自定义 LINQ 使用 | 更新日期: 2023-09-27 18:33:52

我们创建了自定义存储库类来从实体框架上下文中检索对象。Get 方法始终返回整个对象。

我希望包括项目操作员选择作为参数。这样我们就可以从外部传递需要选择的内容,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();
        }
    }
}

使用 LINQ 的自定义投影运算符

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/