首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用实体框架时使用本机OData的Web数据服务

无法使用实体框架时使用本机OData的Web数据服务
EN

Stack Overflow用户
提问于 2016-10-30 12:02:27
回答 1查看 1.3K关注 0票数 0

问答格式:

上下文:有时需要通过OData公开一个与实体框架不兼容的数据表。有时,环境约束会阻止我们修改表模式。例如,SAP数据转储表由另一方维护。

需求:我们可以使用实体框架包装数据库表,这将是一项简单的任务,以生成Odata端点。在这种情况下,我们需要将ODATA select查询选项转换为原生select语句。

问题:如何编写SQL将OData请求转换为OData并返回记录集

EN

回答 1

Stack Overflow用户

发布于 2016-10-30 12:02:27

使用场景:创建一个“具有读写操作的Web 2 OData V3 Controller”,并按照正常情况将其绑定到路由。接下来,通过修改以下模板以适应您的场景,添加数据选择方法:

代码语言:javascript
复制
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:

代码语言:javascript
复制
public interface ILoadFromDataRow
{
    bool LoadFromDataRow(System.Data.DataRow DR, IEnumerable<string> SelectedTableColumnList);
}

实体属性Enum:

代码语言:javascript
复制
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,
}

实体数据类:

代码语言:javascript
复制
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

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40328822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档