Odata StoredProcess返回复杂类型、数据服务、实体框架和WCF

Odata StoredProcess返回复杂类型、数据服务、实体框架和WCF,odata,Odata,我有实体框架TaskTracker.edmx 存在StoredProcedure GetEmployees,并使用复杂类型返回数据 在TaskTrackerDataService.cs上 public static void InitializeService(DataServiceConfiguration config) { // Grant only the rights needed to support the client application. config.SetEnt

我有实体框架TaskTracker.edmx 存在StoredProcedure GetEmployees,并使用复杂类型返回数据

在TaskTrackerDataService.cs上

public static void InitializeService(DataServiceConfiguration config)
{
  // Grant only the rights needed to support the client application.
  config.SetEntitySetAccessRule("*", EntitySetRights.All);
  config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
  config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
}

[WebGet, WebInvoke(ResponseFormat = WebMessageFormat.Xml)]
public IQueryable<TaskTracker_EDM.EmployeeView> GetEmployees()
{
  TaskTracker_EDM.TaskTrackerEntities ctx = new TaskTracker_EDM.TaskTrackerEntities();
  return  ctx.GetEmployees(string.Empty).AsQueryable();
}
publicstaticvoidinitializeservice(DataServiceConfiguration配置)
{
//仅授予支持客户端应用程序所需的权限。
config.SetEntitySetAccessRule(“*”,EntitySetRights.All);
config.SetServiceOperationAccessRule(“*”,ServiceOperationRights.All);
config.DataServiceBehavior.MaxProtocolVersion=DataServiceProtocolVersion.V2;
}
[WebGet,WebInvoke(ResponseFormat=WebMessageFormat.Xml)]
公共IQueryable GetEmployees()
{
TaskTracker_EDM.TaskTrackerEntities ctx=新的TaskTracker_EDM.TaskTrackerEntities();
返回ctx.GetEmployees(string.Empty).AsQueryable();
}
在客户端站点[控制台应用程序]

      var emps = ctxDSvc.Execute<EmployeeView>(new   Uri("http://localhost:2402/TaskTrackerDataService.svc/GetEmployees", UriKind.RelativeOrAbsolute));


  foreach (EmployeeView e in emps)
  {
    Console.WriteLine(string.Format("ID: {0} - {1} ", e.EmployeeID, e.Name));
  }
var emps=ctxDSvc.Execute(新Uri(“http://localhost:2402/TaskTrackerDataService.svc/GetEmployees,UriKind.相对溶质);
foreach(emps中的员工视图e)
{
WriteLine(string.Format(“ID:{0}-{1}”,e.EmployeeID,e.Name));
}
foreach不工作,emps中没有数据

emps一直都有

+       emps    {System.Data.Services.Client.QueryOperationResponse<TaskTrackerConsoleTest.TaskTrackerDataService.EmployeeView>}    
System.Collections.Generic.IEnumerable<TaskTrackerConsoleTest.TaskTrackerDataService.EmployeeView> {System.Data.Services.Client.QueryOperationResponse<TaskTrackerConsoleTest.TaskTrackerDataService.EmployeeView>}
+emps{System.Data.Services.Client.QueryOperationResponse}
System.Collections.Generic.IEnumerable{System.Data.Services.Client.QueryOperationResponse}
我读到OData不支持复杂类型。[他们解决了吗]或者有其他解决方案

有人说,使用Xml到Linq的方法来获取复杂类型。[任何帮助]


任何帮助或建议。

在将结果[ObjectToString]发送到客户端应用程序之前,我在服务器上将其序列化

然后反序列化它

如果还有其他想法,请毫不犹豫地告诉我

1- at TaskTracker_WCF1 -> TaskTrackerData.cs 
   //When StoredProcedure return Complex Type , Then you need to serialise it [Object To String] before send it to Client application

   //OData doesn't support Complex Type

[WebGet]
public String GetEmployees_SPreturnComplexType(String nameSearch)
{
  TaskTracker_EDM.TaskTrackerEntities ctx = new TaskTracker_EDM.TaskTrackerEntities();
     List<TaskTracker_EDM.EmployeeView> hiEmployeeView = (List<TaskTracker_EDM.EmployeeView>)ctx.GetEmployees("Keko88").ToList();

    //Serialize object to String
    XmlSerializer serializer = new XmlSerializer(hiEmployeeView.GetType());

    using (StringWriter writer = new StringWriter())
    {
      serializer.Serialize(writer,hiEmployeeView);

      return writer.ToString();
    }      
}
1-在TaskTracker_WCF1->TaskTrackerData.cs
//当StoredProcedure返回复杂类型时,您需要在将其发送到客户端应用程序之前序列化它[对象到字符串]
//OData不支持复杂类型
[WebGet]
公共字符串GetEmployees\u SPreturnComplexType(字符串名称搜索)
{
TaskTracker_EDM.TaskTrackerEntities ctx=新的TaskTracker_EDM.TaskTrackerEntities();
List hiEmployeeView=(List)ctx.GetEmployees(“Keko88”).ToList();
//将对象序列化为字符串
XmlSerializer serializer=新的XmlSerializer(hiEmployeeView.GetType());
使用(StringWriter=新StringWriter())
{
serializer.Serialize(writer,hiEmployeeView);
返回writer.ToString();
}      
}
2-在program.cs上的控制台应用程序

  TaskTrackerDataService.TaskTrackerEntities ctxDSvc = 
  new TaskTrackerDataService.TaskTrackerEntities(new Uri("http://localhost:2402/TaskTrackerDataService.svc"));
  //=======================================
  //2-1Call StoredProcedure return Complex Type
  String emps = ctxDSvc.Execute<String>(new Uri(ctxDSvc.BaseUri.ToString() + 
                                  "/GetEmployees_SPreturnComplexType", UriKind.RelativeOrAbsolute)).Single();

  //2-2We need to Deserialize it before use it
  var reader = new StringReader(emps);
  var serializer = new XmlSerializer(typeof(List<EmployeeView>));
  List<EmployeeView> instance = (List<EmployeeView>)serializer.Deserialize(reader);
  //=======================================

  foreach (EmployeeView e in instance)
  {
    Console.WriteLine(string.Format("ID: {0} - {1} ", e.EmployeeID, e.Name));
  }
  Console.WriteLine();
  //=======================================
TaskTrackerDataService.TaskTrackerEntities ctxDSvc=
新建TaskTrackerDataService.TaskTrackerEntities(新Uri(“http://localhost:2402/TaskTrackerDataService.svc"));
//=======================================
//2-1调用存储过程返回复合类型
字符串emps=ctxDSvc.Execute(新Uri(ctxDSvc.BaseUri.ToString()+
“/GetEmployees_SPreturnComplexType”,UriKind.RelativeOrAbsolute().Single();
//2-2在使用它之前,我们需要对其进行反序列化
var读取器=新的StringReader(emps);
var serializer=newxmlserializer(typeof(List));
列表实例=(列表)序列化程序。反序列化(读取器);
//=======================================
foreach(实例中的EmployeeView e)
{
WriteLine(string.Format(“ID:{0}-{1}”,e.EmployeeID,e.Name));
}
Console.WriteLine();
//=======================================