Dynamic ObjectQuery <T>против EF 4 с использованием проанализированного Entity SQL - PullRequest
1 голос
/ 02 июня 2011

Я пытаюсь создать полностью динамический способ запроса структуры сущностей с использованием сущности sql, где тип T в ObjectQuery (имя таблицы или имя сущности) неизвестен во время компиляции и передается в метод какstring,

    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 по существу инкапсулирует одиночное предложение where1004 *

  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.

Я открыт для совершенно другого способа сделать это.Но в основном то, что я пытаюсь достичь, похоже на то, что сервисы ODF WCF делают за кулисами - я могу запросить мою модель с помощью только переданных строк - имени объекта, операции, значения и т. Д.строго набрал 'T' в моем запросе.

1 Ответ

1 голос
/ 02 июня 2011

Если у вас есть Entity SQL в качестве строки и вы не возражаете против того, чтобы делать что-то по-старому ADO.NET, вы всегда можете использовать EntityConnection , EntityCommand и EntityDataReader напрямую.

...