2013-04-27 76 views
1

我一直在探索基於www.asp.net上的指南的WEB API,並且在嘗試過濾表中的列時遇到了問題。使用IQueryable select來過濾列

我的代碼很簡單:

// 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; 
    } 

所有我想要做的是檢索Product表的名稱列我JSON。然而,而不是越來越像:

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

我越來越:

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

的價格和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)我在MVC 4項目合作與訂單,項目和訂單明細表。

感謝

+1

如果你只是想返回名稱,爲什麼你不只是返回一個IEnumerable '? (我強烈懷疑你應該擺脫'ToList'和'AsQueryable'調用。) – 2013-04-27 17:49:00

+0

剛剛玩過代碼。我只有ToList和AsQueryable,因爲它阻止了我發佈的其中一個SO鏈接發生的另一個錯誤。但是,我確實有一個返回字符串的遊戲,我似乎正在某處。這意味着我將不得不爲每個不同的請求過濾構建自己的字符串。我只是想象會有更簡單的方法。謝謝 – ASouthorn 2013-04-28 12:02:03

回答

0

我想通了。我只是將產品分配給一個新的變量,並對其進行了選擇調用,並且完美地工作。

因此,現在的:

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列表。

1

你還是返回整個Product實體類型,所以即使您投射到新Product集合,未初始化的屬性將仍然有它們的默認值(0 int)。

您應該創建一個新類型,它只包含您想要公開的屬性(例如ProductInfo)並返回此類型的集合。

或者,如果您的服務支持$ select查詢選項,則客戶端可以執行預測。

+1

ProductInfo唯一的問題是,我計劃讓我的API變得更大,並且依賴任何屬性調用,包括多個選擇器,例如名稱和價格。 我來看看$ select – ASouthorn 2013-04-27 17:55:45

+0

是的,$ API支持正在Web API中進行。根據http://stackoverflow.com/questions/16093783/web-api-odata-select-not-working它應該在每晚編譯。 – devdigital 2013-04-27 18:00:58