LINQ从动态tableName字符串中选择

时间:2014-09-16 00:58:08

标签: linq select dynamic tablename

我想获取具有特定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>();

2 个答案:

答案 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