是否可以在LINQ to Entities上使用反射来查询动态表?

时间:2014-05-01 13:41:16

标签: linq reflection

数据库中有许多表用作"查找"表。除了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。

我可以这样做吗?我一直无法解决这个问题。

2 个答案:

答案 0 :(得分:2)

这个怎么样?

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) 

答案 1 :(得分:0)

我建议使用泛型,也许是反射界面。

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。您的代码明显不同的是,您必须知道实体类型是编译时间,我不确定您是否知道它。