问答格式:
上下文:有时需要通过OData公开一个与实体框架不兼容的数据表。有时,环境约束会阻止我们修改表模式。例如,SAP数据转储表由另一方维护。
需求:我们可以使用实体框架包装数据库表,这将是一项简单的任务,以生成Odata端点。在这种情况下,我们需要将ODATA select查询选项转换为原生select语句。
问题:如何编写SQL将OData请求转换为OData并返回记录集
发布于 2016-10-30 12:02:27
使用场景:创建一个“具有读写操作的Web 2 OData V3 Controller”,并按照正常情况将其绑定到路由。接下来,通过修改以下模板以适应您的场景,添加数据选择方法:
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);
}数据实体类:创建支持下面ILoadFromDataRow接口并为列提供Enum的数据实体类:
接口ILoadFromDataRow:
public interface ILoadFromDataRow
{
bool LoadFromDataRow(System.Data.DataRow DR, IEnumerable<string> SelectedTableColumnList);
}实体属性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,
}实体数据类:
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类超过了允许在堆栈溢出上发布的30000字符限制。因此,我已经在我自己的博客上发布了代码。
在这里可以获得整个代码实现:
http://www.tcwicks.com/software-development/custom-dot-net-mvc-odata-web-api-provider-via-native-sql-when-entity-framework-is-not-feasible
希望这能有所帮助。
https://stackoverflow.com/questions/40328822
复制相似问题