对于ASP.NET的DTO的OData的WebAPI支持 [英] ASP.NET WebApi OData support for DTOs

查看:97
本文介绍了对于ASP.NET的DTO的OData的WebAPI支持的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有项目实体ProjectDTO。
我试图创建一个可以接受和返回ProjectDTOs并使其支持的OData一个的WebAPI控制器的方法。

问题是,我使用的ORM可以使用工程实体项目不DTO查询数据库。有没有办法,我可以申请过滤/排序/从OData的基础上ProjectDTO分页项目单位查询什么办法?

 公共ODataQueryResult< ProjectDTO> GetProjects(ODataQueryOptions< ProjectDTO>查询)
{
    VAR语境=新ORM_Context();    VAR项目= context.Projects; // IQueryable的<项目>
    变种projectDtos = query.ApplyTo(projectDTOs)); //< - 我想在这里实现类似的东西
    VAR projectDTOs =
        projects.Select(
            X =>
            新ProjectDTO
                {
                    ID = x.Id,
                    NAME = x.Name
                });    变种projectsQueriedList = projectDtos.ToList();    VAR的结果=新ODataQueryResult< ProjectDTO>(projectsQueriedList,TOTALCOUNT);    返回结果;
}


解决方案

东西的的这个(我没试过编译)

 使用(VAR的DataContext =新ORM_Context())
{
    VAR项目= dataContext.Projects; // IQueryable的<项目>    //创建一组ODataQueryOptions为内部类
    ODataModelBuilder模型构建器=新ODataConventionModelBuilder();
    modelBuilder.EntitySet<项目>(项目);
    VAR语境=新ODataQueryContext(
         modelBuilder.GetEdmModel()的typeof(项目));
    VAR newOptions =新ODataQueryOptions<项目>(上下文,请求);    变种T =新ODataValidationSettings(){MAXTOP = 25};
    变种S =新ODataQuerySettings(){每页= 25};
    newOptions.Validate(T);
    IEnumerable的<项目> internalResults =
        (IEnumerable的<项目>)newOptions.ApplyTo(项目,S);    INT跳过= newOptions.Skip == NULL? 0:newOptions.Skip.Value;
    INT取= newOptions.Top == NULL? 25:newOptions.Top.Value;    VAR projectDTOs =
            internalResults.Skip(跳过)。取(取)。选择(X =>
                新ProjectDTO
                    {
                        ID = x.Id,
                        NAME = x.Name
                    });    变种projectsQueriedList = projectDtos.ToList();
    VAR的结果=新ODataQueryResult< ProjectDTO>(
        projectsQueriedList,TOTALCOUNT);
    返回结果;
}

I have Project entity and ProjectDTO. I'm trying to create an WebAPI controller method that can take and return ProjectDTOs and make it support OData.

The problem is that I'm using ORM that can query the database using Project entity not Project DTO. Is there any way that I can apply filtering/sorting/paging from OData based on ProjectDTO to Project entity query?

public ODataQueryResult<ProjectDTO> GetProjects(ODataQueryOptions<ProjectDTO> query)
{
    var context = new ORM_Context();

    var projects = context.Projects; // IQueryable<Project>
    var projectDtos = query.ApplyTo(projectDTOs)); // <-- I want to achieve something similar here
    var projectDTOs =
        projects.Select(
            x =>
            new ProjectDTO
                {
                    Id = x.Id,
                    Name = x.Name
                });

    var projectsQueriedList = projectDtos.ToList();

    var result = new ODataQueryResult<ProjectDTO>(projectsQueriedList, totalCount);

    return result;
}

解决方案

Something like this (I haven't tried to compile it)

using(var dataContext = new ORM_Context())
{
    var projects = dataContext.Projects; // IQueryable<Project>

    //Create a set of ODataQueryOptions for the internal class
    ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
    modelBuilder.EntitySet<Project>("Project"); 
    var context = new ODataQueryContext(
         modelBuilder.GetEdmModel(), typeof(Project));
    var newOptions = new ODataQueryOptions<Project>(context, Request);

    var t = new ODataValidationSettings() { MaxTop = 25 };
    var s = new ODataQuerySettings() { PageSize = 25 };
    newOptions.Validate(t);
    IEnumerable<Project> internalResults =
        (IEnumerable<Project>)newOptions.ApplyTo(projects, s);

    int skip = newOptions.Skip == null ? 0 : newOptions.Skip.Value;
    int take = newOptions.Top == null ? 25 : newOptions.Top.Value;

    var projectDTOs =
            internalResults.Skip(skip).Take(take).Select(x =>
                new ProjectDTO
                    {
                        Id = x.Id,
                        Name = x.Name
                    });

    var projectsQueriedList = projectDtos.ToList();
    var result = new ODataQueryResult<ProjectDTO>(
        projectsQueriedList, totalCount);
    return result;
}

这篇关于对于ASP.NET的DTO的OData的WebAPI支持的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆