数据库中有许多表用作"查找"表。除了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。
我可以这样做吗?我一直无法解决这个问题。
答案 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
。您的代码明显不同的是,您必须知道实体类型是编译时间,我不确定您是否知道它。