我想获取具有特定accountID的实体模型(我正在使用EF版本5)的记录列表。我正在提供tableName字符串(这必须是动态的)和accountID。我正在尝试以下两种方法,但它们都没有工作(给我IQueryable对象'表'上的错误:
PropertyInfo info = _db.GetType().GetProperty(tableName);
IQueryable table = info.GetValue(_db, null) as IQueryable;
var query = table.Where(t => t.AccountID == accID)
.Select(t => t);
List <object> recList = ( from records in table
where records.AccountID == accID
select records).ToList<object>();
答案 0 :(得分:7)
var query = table.Where(....).Select(...)
是正确的移动,它允许在运行时像查询构建器一样进行反射。
但是,t.AccountID
是一个错误,因为t
的类型仍然未知。
多年前我在Linq2Sql中直接使用System.Linq.Expressions.Expression已经做过类似的事了。
e.g。
// NOT TESTED
var table=context.GetTable(dynamicTableName);
var theT=table.Experssion; // actually, I forget. DynamicExpression or MemberBinding? or
var theField=Expression.Field(theT, "AccountID"); // or dynamic name
var query=table.Where(Expression.Equal(theField, accID);
var recList=query.ToList<object>();
我记得如果你的对象具有通用接口
,那么应该是一种更简单的语法IQueryable<MyInterface> table = context.GetTable("table") as IQueryable<MyInterface>;
var recList=from r in table
where table.AccountID == ac // if your AccountID is on MyInterface
select table;
或者,如果您只有一些表可以支持。
IQueryable<MyInterface> table;
if("table1"==tableName)
table=_db.table1
elseif("table2"==tableName)
table=_db.table2
elseif("table3"==tableName)
table=_db.table3
else
throw exception
答案 1 :(得分:0)
我为我正在处理的项目构建了一个DynamicRepository。它使用通过EF公开的泛型方法和动态linq。在这里查看源代码可能会有所帮助:
https://dynamicmvc.codeplex.com/SourceControl/latest#DynamicMVC/DynamicMVC/Data/DynamicRepository.cs
您可以查询实体框架元数据工作空间以获取给定表名的类型。此链接可能有所帮助: Get Tables and Relationships