2011-06-22 167 views
4

這裏我的問題和要求是什麼。WCF Json數據返回

//下面是我的一類功能,即名單是用戶,我有更多的10-15級功能

public IEnumerable<Entity.User> User() 
    { 
     OpenStoredPorcedure("spDB"); 

     DataSet d = ExecuteDataSet(); 

     DataTable myDataTable = d.Tables[0]; 

     var stList = new List<Entity.User>(); 

     foreach (DataRow dr in myDataTable.Rows) 
     { 
      Entity.User usr = new Entity.User() 
      { 

       FirstName = dr["first_name"].ToString() ?? null, 
       LastName = dr["last_name"].ToString() ?? null 
      }; 

      stList.Add(usr); 
     } 

     return stList.AsEnumerable(); 
} 
在WCF

現在我想一個功能類似下面一個

public IEnumerable fetchData(int id) 
{   
    IEnumerable result1 = null; 

    switch (id) 

    { 
     case 1: 
      IEnumerable<Entity.User> result = User().AsEnumerable<Entity.User>().ToArray(); 
      result1 = result; 
      break; 
     case 2: 
      IEnumerable<Entity.Project> result = User().AsEnumerable<Entity.Project>().ToArray(); 
      result1 = result; 
      break; 
    } 

    return result1; 
} 

但使用上述方法時出現此錯誤

請求錯誤 服務器在處理請求時遇到錯誤。異常消息是'Can not serialize parameter'System.Collections.Generic.List`1 [Entity + User]'(用於操作'fetchData',簽約'ISyncService')的參數,因爲它不是確切類型'System.Collections。 IEnumerable'在方法簽名中,不在已知類型集合中。爲了序列化參數,將類型添加到已知類型集合中進行操作使用

現在我希望在WCF中調用此函數並傳遞id它的結果將導致該實體類的json列表。

我,當我使用下面的函數

public List<Entity.User> fetchData() 
{ 
     return User().ToList();  
} 
+0

什麼實際的階級結構的樣子。 – OpticalDelusion

+0

public class User: { public string userId {get;組; } public string FirstName {get;組; } public string LastName {get;組; } public string EmailId {get;組; } public string Password {get;組; } public bool status {get;組; } } – Raman

回答

1

的情況下獲得的JSON數據,你有你回報,你應該在你的基類datacontract添加KnownType屬性,然後在類型之間的基類和繼承在該屬性指定所有派生類型

像這樣的事情

[KnownType(typeof(YourDerivedType))] 

下面是一些幫助:http://blogs.msdn.com/b/sowmy/archive/2006/06/06/all-about-knowntypes.aspx

如果你要返回的類型不相關,你應該按照OsQu的建議做一些事情。

+0

我剛編輯我的問題。請看一下,讓我知道你是否可以在這方面提供幫助。謝謝 – Raman

+0

這是正確的我很確定。但是這個屬性在你的Entity類中,並且爲從Entity派生的每個子類執行一個屬性。 [KnownType(typeof(User))] [KnownType(typeof(Result))] – OpticalDelusion

0

我認爲這個問題是你需要給IEnumerable輸入類型。

如果您知道每個表中的類型,則可以創建通用方法併爲其提供正確的類型。

public IEnumerable<T> fetchData<T>(int id) 
{   
    IEnumerable<T> result1 = null; 

    switch (id) 
    { 
     case 1: 
      IEnumerable<T> result = sync.User() as IEnumerable<T>; 
      result1 = result; 
      break; 
    } 

    return result1; 
} 

,然後使用它:

IEnumerable<Entity.User> retVal = fetchData<Entity.User>(1); 

更多關於泛型:Generics C#

+0

通過使用上面我得到這個錯誤System.Collections.Generic.List '不包含'AsEnumerable'的定義和最好的擴展方法重載'System.Linq.Enumerable.AsEnumerable (System.Collections.Generic.IEnumerable ) – Raman

+0

哦,我錯過了AsEnumerable ()。什麼類型的sync.User()返回? – OsQu

+0

它返回在IEnumerable – Raman