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 コマンド文字列を作成します。

  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 の方法で処理してもかまわない場合は、いつでもEntityConnectionEntityCommand、およびEntityDataReaderを直接使用できます。

于 2011-06-02T17:41:28.913 に答える