【问题标题】:How to access DbSet type dynamically如何动态访问 DbSet 类型
【发布时间】:2015-11-11 23:42:43
【问题描述】:

我正在使用 LINQ 表达式来动态构建 select 和 where 表达式。

select 方法如下所示:

public Expression<Func<TSource, TTarget>> GetSelectExpression<TSource, TTarget>()
    {
        ParameterExpression l_pe = Expression.Parameter(Base_type, "source");  
...            
        Expression<Func<TSource, TTarget>> l_return = Expression.Lambda<Func<TSource, TTarget>>(l_select, new ParameterExpression[] { l_pe });
        l_return.Compile();

        return l_return;
    }

Where 方法如下所示:

public Expression<Func<TTarget, bool>> GetWhereExpression<TTarget>()
    {
        ParameterExpression l_pe = Expression.Parameter(Dto_type, "dto");

        ....

        Expression<Func<TTarget, bool>> l_return = Expression.Lambda<Func<TTarget, bool>>(l_or, new ParameterExpression[] { l_pe });
        l_return.Compile();

        return l_return;
    }

如果我调用以下语句,一切正常:

var l_where = GetWhereExpression<CrudChangetaskDto>();
var l_select = GetSelectExpression<A_Changetask, CrudChangetaskDto>();               

IQueryable<CrudChangetaskDto> l_query = l_db.A_Changetask.Select(l_select).Where(l_where);
var lt_result = l_query.ToList();

由于更动态地使用 WHERE 和 SELECT 方法,我喜欢有一个返回 IQueryable 的方法,如下所示(PaltrConnect 是数据库上下文):

IQueryable<TTarget> GetSearchhelpvalue<TSource, TTarget>(PaltrConnect context)
    {   
        var l_dbset = context.Set(typeof(TSource));            

        IQueryable<TTarget> l_query = l_dbset.Select(GetSelectExpression<TSource,TTarget>()).Where(GetWhereExpression<TTarget>());
        return l_query;
    }

很遗憾,这在语法上是不正确的。我收到错误消息 System.Linq.IQueryable 无法转换为 System.Linq.IQueryable。

最后,我喜欢通过以下方式调用GetSearchhelpvalue:

using (var l_db = new PaltrConnect)
  {
    IQueryable<CrudChangeTaskDto> l_query = GetSearchhelpvalue<A_Changetask, CrudChangetaskDto>(l_db);
    var lt_result = l_query.ToList();
  }

如何访问与 TSource 对应的类型的 DbSet 或如何解决?

你的 斯蒂芬

【问题讨论】:

    标签: c# linq dbset


    【解决方案1】:

    你离得很近。像这样使用通用的DbContext.Set&lt;TEntity&gt;() overload 而不是非通用的DbContext.Set(Type)

    IQueryable<TTarget> GetSearchhelpvalue<TSource, TTarget>(PaltrConnect context)
        where TSource : class
    {   
        return context.Set<TSource>()            
            .Select(GetSelectExpression<TSource,TTarget>())
            .Where(GetWhereExpression<TTarget>());
    }
    

    注意它需要class 约束。

    【讨论】:

    • 你是绝对正确的:)。你给了我正确的方向与约束。非常感谢您的快速回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 2012-02-12
    • 2017-12-29
    • 2011-05-07
    相关资源
    最近更新 更多