2013-10-25 71 views
1

我很難理解我的選項從我的控件中的查詢返回json,因爲似乎有很多方法可以做到這一點。任何澄清將非常感激。如何將JSON從Linq返回到實體查詢?

我想從以下返回JSON:

public class MyController : ApiController 
{ 
private MyEntities context = new MyEntities(); 

public IQueryable <string> Get() 
{ 

    var query = 
     from MY_ENTITY_1 in my_entity_1 
     from MY_ENTITY_2 in my_entity_2 
     from MY_ENTITY_3 in my_entity_3 

     where 
      MY_ENITITY_1.something == MY_ENTITY_2.something 

     select new 
      { 
       Result1 = MY_ENTITY_1.FOO1, 
       Result2 = MY_ENTITY_2.FOO2, 
       Result3 = MY_ENTITY_3.FOO3 
      }; 

    foreach (var myResults in query) 
    { 
     Console.WriteLine(myResults); 
    }; 

    return myResults; // JSON? 
} 

回答

2

我的理解是,ApiController自動轉換返回的對象爲JSON時,這些動作被調用:

public IQueryable <MyGetResult> Get() 

{ 

    var query = 
     from MY_ENTITY_1 in my_entity_1 
     from MY_ENTITY_2 in my_entity_2 
     from MY_ENTITY_3 in my_entity_3 

     where 
      MY_ENITITY_1.something == MY_ENTITY_2.something 

     select new MyGetResult 
      { 
       Result1 = MY_ENTITY_1.FOO1, 
       Result2 = MY_ENTITY_2.FOO2, 
       Result3 = MY_ENTITY_3.FOO3 
      }; 
    return query; 
} 

public class MyGetResult 
{ 
    public Foo Result1 {get;set;} 
    public Foo Result2 {get;set;} 
    public Foo Result3 {get;set;} 
} 

的WebAPI使用策略調用"Content Negotiation"來確定調用者想要的數據類型,並相應地自動序列化結果。

+0

謝謝StriplingWarrior,這看起來有很大的改進和清晰。如果返回多行,那麼在返回'返回查詢'之前,有必要在這裏迭代它們?這應該發生在客戶端嗎?還是隻是處理? –

+0

@ChristopherCrisis:框架應該能夠處理它:它可能會返回代表具有數組的對象的JSON。我將親自調用'return query.ToList();',並在'using'語句中創建上下文以確保它被丟棄。雖然您可能想要多讀一點,因爲我似乎記得WebApi能夠將OData支持添加到返回IQueryables的操作。 – StriplingWarrior

+0

非常感謝StriplingWarrior ... –

1

ApiController看來您使用的是WebAPI您不必從方法返回JSON或XML,而只需返回對象。調用者有責任指定返回數據類型。

例如,如果您通過IE瀏覽您的服務,您將返回JSON,因爲IE使用JSON作爲默認返回類型。如果您在Chrome瀏覽器中瀏覽同一個網址,則會返回XML,因爲這是Chrome的默認網址,所以取決於請求的ContentType(如果它是ContentType: application/json),那麼您將返回JSON。