2013-11-26 78 views
0

我有實體框架TaskTracker.edmx 有StoredProcedure的裝getEmployees和使用複雜類型在TaskTrackerDataService.cs的StoredProcedure返回複雜類型,數據服務,實體框架和WCF

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(); 
} 
返回數據

在的客戶端站點[控制檯應用程序]

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

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

我讀的OData不支持複雜類型。[他們有沒有解決這個問題],還是有其他的解決方案。

有人說,用一種Xml來Linq類的方法來獲得複雜類型。 [任何幫助]

任何幫助或建議。

回答

0

序列化的結果[的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(); 
    }  
} 

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(); 
    //=======================================