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

标签 asp.net linq entity-framework asp.net-web-api

我用ASP.NET Web API构建了一个不错的API,但是我想从我的上下文( Entity Framework )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));
    }
}

顺便说一句,以下代码是您想执行的一次操作,例如在静态构造函数中或在WebApiConfig.cs文件中。
Mapper.CreateMap<Item, ItemDto>()
    .ForMember(itemDto => itemDto.Category, mce => mce.MapFrom(item => item.Category.Name));

关于ASP.NET Web API返回可查询的DTO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9894369/

相关文章:

c# - 在 IQueryable 查询中减去 DateTimes

entity-framework - EntityObject 有多重要?

entity-framework - Azure WebJob 不再选取门户中的 Entity Framework 连接字符串设置

c# - 如何最好地处理包含 0 到 3 个参数/过滤器但使用单个 LinQ to Entities 表达式的搜索查询

javascript - 通过复选框更改按钮的启用属性

c# - 在 asp.net 页面中动态添加 javascript 的一些最佳实践是什么?

javascript - 无法修改 Controls 集合,因为该控件包含代码块(即 <% ... %>)。Telerik.Web.UI.RadAjaxControl.MoveUpdatePanel

c# - LINQ to XML 后代中的后代

entity-framework - 是否可以将现有的 MVC4 Web 应用程序升级到 MVC5?

ASP.NET Web 应用程序构建输出 - 如何包含所有部署文件?