2012-01-21 101 views
1

我正在寫一個簡單的電影數據庫,它有三層服務層,數據訪問層和SQL數據庫。LINQ to SQL Datacontext映射到WCF DataContract

我使用LINQ to SQL來訪問數據庫並從數據庫中的電影表中返回一個電影。這將從服務層的DataContracts中作爲Film對象返回。

我認爲這會工作正常,但它導致了一些尷尬的代碼,看起來不正確。有人可以理智地檢查這個嗎?

將每個LINQ結果映射到DataContract是否最佳做法?

public static class DBConnection 
{ 
    private static RMDB_LINQDataContext _db; 

    static DBConnection() 
    { 
     _db = new RMDB_LINQDataContext(); 
    } 


    public static RMDB.DTO.Film GetFilm(string name) 
    { 
     var LINQ_film = from film in _db.GetTable<Film>() 
         where film.name == name 
         select film; 

     if (LINQ_film.ToList().Count != 1) 
     { 
      // TODO - faultException 
     } 
     else 
     { 
      foreach (Film f in LINQ_film.ToList()) 
      { 
       // Yuck 
       return new RMDB.DTO.Film(f.name, 
        f.releaseDate.GetValueOrDefault(), "foo", f.rating.GetValueOrDefault()); 
      } 
     } 

     return null; 
    } 

回答

1

這有點更整潔並且更有效,因爲您的配方執行查詢兩次

public static List<Film> GetFilm(string name) 
    { 
     var LINQ_film = from film in _db.GetTable<Film>() 
         where film.name == name 
         select new Film(film.name, 
             film.releaseDate.GetValueOrDefault(), 
             "foo", 
             film.rating.GetValueOrDefault()); 

     var list = LINQ_film.ToList(); 
     if (list.Count != 1) 
     { 
      // TODO - faultException 
     } 

     return list; 
    } 

複製一個類型到另一個的一個實例是標準的做法從域對象到DTO映射時。它可能看起來像更多的工作,但它是一個純粹的基於內存的映射,併爲您的業務層和客戶之間提供了一層隔離。如果沒有它,客戶端將會受到業務層重構的影響

+0

假設'電影'(來自DB)意味着與RMDB.DTO.Film不同,並且如果可以複製一個類的每個實例到另一個的實例。我會說,是的,沒關係。 – Clemens

+0

那麼你最終爲每個查詢寫一個POCO? – SkeetJon

+0

我最終爲每個發送的不同消息寫了一個DataContract。一些操作採用相同的結構化消息 –