сценарий использования: действия Создание «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
Надеется, что это помогает.