加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

ASP.NET Web API返回可查询的DTO?

发布时间:2020-12-15 20:48:27 所属栏目:asp.Net 来源:网络整理
导读:我使用ASP.NET Web API构建了一个不错的API,但是我猜想从我的上下文(实体框架)AsQueryable返回实体是不对的,所以我将所有内容映射到DTO对象. 我还不太明白,我如何保持我的上下文可以查询,但仍然只返回DTO而不是实体?还是这不可能? 这是我的代码: public I
我使用ASP.NET Web API构建了一个不错的API,但是我猜想从我的上下文(实体框架)AsQueryable返回实体是不对的,所以我将所有内容映射到DTO对象.

我还不太明白,我如何保持我的上下文可以查询,但仍然只返回DTO而不是实体?还是这不可能?

这是我的代码:

public IQueryable<ItemDto> Get()
{
    using (EfContext context = new EfContext())
    {
        Mapper.CreateMap<Item,ItemDto>()
            .ForMember(itemDto => itemDto.Category,mce => mce.MapFrom(item => item.Category.Name));

        IEnumerable<ItemDto> data = Mapper.Map<IEnumerable<Item>,IEnumerable<ItemDto>>(context.Items
            .OrderByDescending(x => x.PubDate)
            .Take(20));

        return data.AsQueryable();
    }
}

正如你可以看到我加载数据,并使这个小的IEnumerable集合可查询.问题是,为这段代码生成的查询可能是非常低效的,因为它首先加载所有项目(或至少20个第一个项目),然后过滤输出.

我希望我描述我的问题尽可能好,这有点难以解释.我在Google上找不到任何内容.

解决方法

不要先选择内存中的所有内容.做这样的事情:
public IQueryable<ItemDto> Get()
{
    using (EfContext context = new EfContext())
    {
        var query = from item in context.Items
                    select Mapper.Map<Item,ItemDto>(item)

        return query.OrderByDescending(x => x.PubDate).Take(20));
    }
}

BTW以下代码是您想要执行的操作,例如在静态构造函数或WebApiConfig.cs文件中.

Mapper.CreateMap<Item,ItemDto>()
    .ForMember(itemDto => itemDto.Category,mce => mce.MapFrom(item => item.Category.Name));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读