使用IQueryable选择筛选列

时间:2013-04-27 17:45:03

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

我一直在根据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项目中工作。

由于

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

我明白了。我刚刚将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 of Products。