2016-10-30 1 views
0

Q & формат:Service OData Web API данных с использованием нативного SQL, когда Entity Framework не может быть использована

Контекст: Иногда нам нужно выставить таблицу данных, который не совместим с каркасом Entity через OData. Иногда ограничения среды не позволяют нам изменять схему таблицы. Например, таблицы дампов данных SAP, поддерживаемые другой стороной.

Требования: Мы можем обернуть таблицу базы данных с помощью инфраструктуры Entity, это было бы простой задачей для создания конечной точки Odata Web ApI из коробки. В этом контексте нам нужно перевести опции выбора выбора ODATA в собственные инструкции выбора SQL.

Вопрос: Как мы пишем SQL Builder, чтобы перевести запрос OData в SQL и возвращает RecordSet

ответ

1

сценарий использования: действия Создание «Web API 2 OData V3 контроллера с чтения/записи "и привязать его к маршрутизации в соответствии с нормальным. Затем добавьте ваши данные выберите методы, изменив следующий шаблон, чтобы соответствовать вашему сценарию:

public IHttpActionResult GetEntitySomeEntityType(ODataQueryOptions<EntityPMDVendorLookup> queryOptions) 
{ 
    // validate the query. 
    try 
    { 
     queryOptions.Validate(_validationSettings); 
    } 
    catch (ODataException ex) 
    { 
     return BadRequest(ex.Message); 
    } 
    SQLODataBuilder<SomeEntityType, SomeEntityType_Column> SQLBuilder; 
    SQLBuilder = new SQLODataBuilder<Models.PMD.Lookup.SomeEntityType, Models.PMD.Lookup.SomeEntityType_Column>(queryOptions, SomeEntityType_Column.VendorNumber, true); 
    SQLBuilder.DefaultSortColumn = SomeEntityType_Column.VendorNumber; 
    SQLBuilder.DefaultSortAscending = true; 
    SQLBuilder.UseSelectDistinct = true; 
    List<SomeEntityType> ResultList; 
    ResultList = new List<Models.PMD.Lookup.SomeEntityType>(); 
    ResultList = SQLBuilder.ExecuteQuery(@"TableName", System.Configuration.ConfigurationManager.ConnectionStrings[@"ConnectionStringName"].ConnectionString); 
    return Ok<IEnumerable<SomeEntityType>>(ResultList); 
} 

Паспорта Entity Класс: Создание класса сущностей данных, который поддерживает ILoadFromDataRow интерфейс ниже и обеспечивает Enum для столбцов:

Интерфейс ILoadFromDataRow:

public interface ILoadFromDataRow 
{ 
    bool LoadFromDataRow(System.Data.DataRow DR, IEnumerable<string> SelectedTableColumnList); 
} 

Entity недвижимости Enum:

public enum SomeEntityType_Column 
{ 
    [Description("Some Field")] 
    SomeField = 0, // This is the Primary Key field value = 0 
    [Description("Another Field")] 
    AnotherField, 
    [Description("Yet Another Field")] 
    YetAnotherField, 
} 

Entity Data Класс:

public class SomeEntityType : ILoadFromDataRow 
{ 
    public SomeEntityType() 
    { 

    } 
    public bool LoadFromDataRow(System.Data.DataRow DR, IEnumerable<string> SelectedTableColumnList) 
    { 
     bool Success; 
     int FieldCount; 
     Success = true; 
     FieldCount = 0; 
     try 
     { 
      foreach (string DBColumn in SelectedTableColumnList) 
      { 
       FieldCount += 1; 
       switch (DBColumn) 
       { 
        case @"Some Field": 
         SomeField = DR[@"FunkyDBFieldName"].ToString(); 
         break; 
        case @"Another Field": 
         AnotherField = DR[@"Even More Funky"].ToString(); 
         break; 
        case @"Yet Another Field": 
         YetAnotherField = DR[@"Very bad fielD NaMe With SpaCes"].ToString(); 
         break; 
       } 
      } 
      //Conditional Logic depending on your scenario 
      if (string.IsNullOrEmpty(SomeField)) 
      { 
       if (FieldCount == 1) 
       { 
        // Some Logic to calculate stuff 
       } 
      } 
     } 
     catch 
     { 
      Success = false; 
     } 
     return Success; 
    } 

    public string SomeField { get; set; } 
    public string AnotherField { get; set; } 
    public string YetAnotherField { get; set; } 
} 

Полный класс SQL Builder превышает предел 30000 символов позволяет постов на переполнение стека. Поэтому я разместил код в своем собственном блоге.

Вся реализация кода доступна здесь:

http://www.tcwicks.com/software-development/custom-dot-net-mvc-odata-web-api-provider-via-native-sql-when-entity-framework-is-not-feasible

Надеется, что это помогает.