1

我正在尝试创建一种完全动态的方式来使用实体 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);

我收到一条错误消息:

在当前加载的模式中,“名称”不是“MyDBModel.Person”类型的成员。靠近简单标识符,第 1 行,第 74 列。

我对一种完全不同的方式持开放态度。但基本上我想要实现的目标类似于 WCF OData 服务在幕后所做的——我可以只使用传入的字符串来查询我的模型——实体名称、操作、值等。不需要在我的查询中强烈键入“T”。

4

1 回答 1

1

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

于 2011-06-02T17:41:28.913 回答