动态对象查询<;T>;针对EF 4使用解析的实体SQL

本文关键字:SQL 实体 针对 查询 对象 lt 动态 gt EF | 更新日期: 2023-09-27 17:58:11

我正在尝试创建一种使用实体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"。

动态对象查询<;T>;针对EF 4使用解析的实体SQL

如果您将实体SQL作为字符串,并且不介意使用老式的ADO。NET方式,您可以始终直接使用EntityConnection、EntityCommand和EntityDataReader。