使用已解析的实体SQL </t>对EF 4进行动态ObjectQuery <t>

时间:2011-06-02 16:59:54

标签: c# linq entity-framework dynamic entity-sql

我正在尝试使用实体sql创建一个完全动态的方式来查询实体框架,其中ObjectQuery中的类型T(表名或实体名称)在编译时是未知的,并作为一个方法传递给方法串,

    public class EntityQuery
    {
         public ObjectContext Context { get; private set; }
         public string TableName { get; private set; }

         public EntityQuery(ObjectContext context, string sourceObject)
         {
              MemberInfo[] mInfo = context.GetType().GetMembers();

              TableName = sourceObject; 
              Context = context;

              if (!mInfo.Any<MemberInfo>(MemberInfo => MemberInfo.Name == TableName))
                   throw new EntityOperationException("Entity '" + TableName + "' does not exist in the object context.");
         }

         public ObjectQuery<dynamic> InitiateQuery(List<EntityFilter> filters)
         {
              string predicate = DynamicESQLBuilder.GetESQL(filters, Context.DefaultContainerName, TableName);
              string format = String.Format("[{0}]", predicate);

              ObjectQuery<dynamic> query = new ObjectQuery<dynamic>(predicate, Context, MergeOption.NoTracking);

              return query;
         }
}

类DynamicESQLBuilder基于传入的上下文名称,表名和实体过滤器创建实体sql命令字符串.'EntityFilter'类基本上封装了单个'where'子句,

  public class EntityFilter
  {
      public ExpressionType OpType { get; private set; }
      public string PropertyName { get; private set; }
      public object Value { get; private set; }
  }

当我尝试使用它时,

        MyDBModel db = new MyDBModel();

        List<EntityFilter> filters = new List<EntityFilter>()
        {
            new EntityFilter("Name", ExpressionType.Equal, "Sean")
        };

        EntityQuery query = new EntityQuery(db, "Person");

        var results = query.InitiateQuery(filters);

我收到错误声明:

'Name'不是当前加载的模式中'MyDBModel.Person'类型的成员。近简单标识符,第1行,第74列。

我愿意以完全不同的方式这样做。但基本上我想要实现的是类似于WCF OData服务在幕后做的事情 - 我可以用传入的字符串查询我的模型 - 实体名称,操作,值等。不需要在我的查询中强烈输入'T'。

1 个答案:

答案 0 :(得分:1)

如果您将Entity SQL作为字符串使用并且不介意使用旧式ADO.NET方式,则可以始终使用EntityConnectionEntityCommandEntityDataReader直接