【问题标题】:Using IQueryable select to filter columns使用 IQueryable 选择过滤列
【发布时间】:2013-04-21 17:32:36
【问题描述】:

我一直在根据 www.asp.net 上的指南探索 WEB API,但在尝试从表中过滤列时遇到了问题。

我的代码是这样的:

    // GET api/Admin
    public IEnumerable<Product> GetProducts(testvar = "")
    {
        IQueryable<Product> productString = db.Products;

        if (testvar != "")
        {
            productString = productString.ToList().Select(i => new Product
            {
                Name = i.Name
            }).AsQueryable();
        }
        return productString;
    }

我要做的就是从我的 JSON 的 Product 表中检索 Name 列。然而,而不是得到类似的东西:

[{"Name":"Hammer"}] or [{"$id":"1","Name":"Hammer"}]

我明白了:

[{"$id":"1","Id":0,"Name":"Hammer","Price":0.0,"ActualCost":0.0}]

Price 和 ActualCost 值通常为 16.99 和 20.00,但不会删除它们,而是将它们返回为 0。Id 也是如此。

有没有一种简单的方法可以阻止它返回 Id、Price 和 ActualCost?也许我错过了一些非常简单的东西,但下面的两个链接是我找到的最接近的链接。

IQueryable C# Select

The entity cannot be constructed in a LINQ to Entities query

根据我一直在使用的指南 (http://www.asp.net/web-api/overview/creating-web-apis/using-web-api-with-entity-framework/using-web-api-with-entity-framework,-part-1),我正在使用带有 Orders、Projects 和 OrderDetails 表的 MVC 4 项目。

谢谢

【问题讨论】:

  • 如果您只是想返回名称,为什么不返回IEnumerable&lt;string&gt;? (我强烈怀疑你也应该摆脱 ToListAsQueryable 的调用。)
  • 刚刚玩过代码。根据我发布的一个 SO 链接,我只有 ToList 和 AsQueryable,因为它阻止了另一个错误的发生。但是,我确实有一个返回字符串的游戏,我似乎正在到达某个地方。这意味着我将不得不为每个不同的请求过滤构建自己的字符串。我只是想象会有一个更简单的方法。谢谢

标签: c# asp.net-mvc entity-framework asp.net-web-api iqueryable


【解决方案1】:

您仍在返回完整的 Product 实体类型,因此即使您正在投影到新的 Product 集合,未初始化的属性仍将具有其默认值(int 为 0)。

您应该创建一个新类型,其中只包含您希望公开的属性(例如ProductInfo)并返回此类型的集合。

或者,如果您的服务支持 $select 查询选项,客户端可以执行投影。

【讨论】:

  • 例如,ProductInfo 的唯一问题是我计划让我的 API 更大并且依赖于任何属性调用,包括多个选择器,例如名称和价格。我会看看 $select
  • 是的,$select 支持正在 Web API 中工作。根据stackoverflow.com/questions/16093783/…,它应该很快就会出现在夜间构建中。
【解决方案2】:

我想通了。我刚刚将 Product 分配给了一个新变量并对其进行了 select 调用,它运行良好。

所以现在代替:

productString = productString.ToList().Select(i => new Product
        {
            Name = i.Name
        }).AsQueryable();

我有

var productInfos =
                    from i in productString
                    select new { i.Name };
                    newVariable.Add(productInfos);

然后我返回 newVariable,它是一个对象列表,而不是产品的 IEnumerable。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-27
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    相关资源
    最近更新 更多