【问题标题】:Is it Possible to use reflection on LINQ to Entities to query a dynamic table?是否可以在 LINQ to Entities 上使用反射来查询动态表?
【发布时间】:2014-05-01 21:57:48
【问题描述】:

数据库中有许多表用作“查找”表。除了 ID 列名之外,所有表都具有相同的结构。

我发现我可以使用反射来打开一个表并枚举记录。该方法接受一个字符串 (tableName)。

Uri serviceUri = new Uri("http://localhost/MyDataService/WcfDataService.svc");
var context = new MyEntities(serviceUri);
var eTable = typeof(MyEntities).GetProperty(tableName).GetValue(context, null) as IEnumerable<object>
foreach (object o in eTable)
...

这很好用,但我想在查询中添加一个 WHERE 子句。例如,其中 InactiveDate == null。

我可以这样做吗?我一直无法弄清楚这一点。

【问题讨论】:

    标签: linq reflection


    【解决方案1】:

    这个怎么样?

    var eTable = (typeof(MyEntities).GetProperty(tableName).GetValue(context, null) as IEnumerable<object>).Where(obj => obj.GetType().GetProperty("InactiveDate").GetValue(obj) == null);
    foreach (object o in eTable) 
    

    【讨论】:

    • 这会获取客户端上的所有记录和过滤器。
    • 难以置信。我可以为自己没有弄清楚这一点而扇自己耳光!这将适用于查找表,正是我所需要的。我知道这不是最好的解决方案,因为我宁愿将过滤器作为查询的一部分应用到服务器上。有没有办法在事先不知道表名的情况下创建查询?
    • 然后我会尝试不将可查询集合转换为 IEnumerable 而是转换为 IQueryable 然后转换为 Where 方法,您需要传递一个 Expression 对象,然后将其转换为 uri。要创建 Expression,您可以使用 Expression 静态类。我为 DbContext 做了这样的事情,应该也适用于 DataServiceContext。
    【解决方案2】:

    我会建议使用泛型,也许是一个接口而不是反射。

    public function Xyz<TEntity>(Func<MyEntities, IDbSet<TEntity>> dbSetGetter, Expression<Func<TEntity, Boolean>> filter)
    {
       var serviceUri = new Uri("http://localhost/MyDataService/WcfDataService.svc");
    
       using (var context = new MyEntities(serviceUri))
       {
          foreach (var entity in dbSetGetter(context).Where(filter))
          {
             DoSomethingWith(entity);
          }
       }
    }
    

    用法应该是这样的

    Xyz(context => context.Foo, foo => foo.Bar == 42);
    

    假设您有一个实体Foo,其整数属性为Bar。与您的代码明显不同的是,您必须在编译时知道实体类型,我不确定您是否知道。

    【讨论】:

    • 谢谢,丹尼尔。这很好,但我不知道正在请求哪个表。不过,这对我来说非常好,可以作为将来的参考。
    猜你喜欢
    • 2011-11-17
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 2016-03-07
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    相关资源
    最近更新 更多