2011-07-26 95 views
5

我有一個WCF/REST Web服務,我正在考慮使用Linq to SQL來從中返回數據庫信息。在REST/WCF服務中將數據集從LINQ返回給SQL

這是很容易做到的基本查詢對錶和返回行,例如:

[WebGet(UriTemplate = "")] 
    public List<User> GetUsers() 
    { 
     List<User> ret = new List<User>(); ; 
     using (MyDataContext context = new MyDataContext()) 
     { 
      var userResults = from u in context.Users select u; 
      ret = userResults.ToList<User>(); 
     } 

     return ret; 
    } 

但是,如果我想返回多個表中的數據是什麼,或者不完全表的模式匹配?我無法弄清楚如何從該查詢返回的結果,例如:

var userResults = from u in context.Users 
    select new { u.userID, u.userName, u.userType, 
       u.Person.personFirstname, u.Person.personLastname }; 

顯然,導致行集不堅持「用戶」的模式,所以我不能只是轉換到一個列表用戶對象。

我嘗試在我的對象模型中創建一個與結果集相關的新實體,但它不想執行轉換。

我錯過了什麼?

編輯:相關問題:存儲過程返回的結果如何?同樣的問題,將它們打包以便通過服務返回的最佳方式是什麼?

回答

4

您可以創建一個Complex Type,而不是返回Anonymous對象返回複雜類型。在使用函數導入映射存儲過程時,可以選擇自動創建複雜類型。

創建你需要的屬性的自定義類:

using (linkDataContext link = new linkDataContext()) 
{ 
    var data = (from t in link.TimesheetDetails 
       select new MyTimesheet 
       { 
        Id = t.Id, 
        Data = t.EmployeeId.ToString() 
       }).ToList(); 
} 
+0

這就是實體框架,而不是直接Linq To SQL。我儘量避免使用實體框架。 – BDW

+0

哦,我明白了。你可以創建一個具體類,而不是像m4tt1mus建議的匿名類。 –

+0

但是,讓我們說我使用實體框架。我知道複雜類型如何與存儲過程協同工作,這不是問題。如何將linq映射到我上面的複雜類型的sql查詢?沒有什麼我正在努力工作。 – BDW

5

一般來說,你不應該從服務返回的域對象:

public class MyTimesheet 
{ 
    public int Id { get; set; } 
    public string Data { get; set; } 
} 

然後從你的Linq查詢創建因爲如果你這樣做,你會遇到類似你發現的問題。域對象旨在描述問題域中的特定實體,並且通常不適合提供特定的一組數據以從服務調用中返回。

您最好通過創建data transfer objects來表示它們僅包含需要傳輸的信息來將您的域實體從服務中解耦出來。 DTOs會有構造函數,它們需要域對象並複製需要的任何屬性值(您還需要一個無參數的構造函數,以便它們可以被序列化),或者可以使用像AutoMapper這樣的對象對象映射器。他們還將具有特定於服務的功能,如IExtensibleDataObjectDataMemberAttributes,這些功能不適用於域對象。這使您的域對象可以獨立於您從服務發送的對象而變化。

相關問題