这就是我的问题和要求。
//下面是我的一个类函数列表,即用户,我还有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;
}
但是我在使用上述方法时遇到此错误
请求错误 服务器遇到处理请求的错误。异常消息是'无法序列化类型的参数'System.Collections.Generic.List`1 [Entity + User]'(对于操作'fetchData',合同'ISyncService'),因为它不是确切的类型'System.Collections。 IEnumerable'在方法签名中,不在已知类型集合中。要序列化参数,请使用
将类型添加到操作的已知类型集合中现在我希望在WCF中我们调用这个函数并传递id,它将导致该实体类的json列表。
当我使用以下功能
时,我收到了Json数据public List<Entity.User> fetchData()
{
return User().ToList();
}
答案 0 :(得分:1)
如果您在返回的类型之间有基类和继承,则应在基类datacontract上添加KnownType属性,然后在属性中指定所有派生类型
像这样的东西
[KnownType(typeof(YourDerivedType))]
以下是一些帮助:http://blogs.msdn.com/b/sowmy/archive/2006/06/06/all-about-knowntypes.aspx
如果您返回的是彼此不相关的类型,您应该按照OsQu的建议做一些事情。
答案 1 :(得分: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的更多信息:Generics C#