2011-07-26 12 views
5

私はLinq to SQLを使用してデータベース情報を返すことを検討しているWCF/REST Webサービスを持っています。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を作成することができます。匿名オブジェクトを返す代わりに、複合型が返されます。関数インポートを使用してストアドプロシージャをマップする場合、複合型を自動的に作成するオプションがあります。

必要なプロパティを持つカスタムクラスを作成します。

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

その後、あなたのLINQクエリからそれを作成します。

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

これはEntity Frameworkであり、Linq To SQLとまったく同じではありません。私は可能な限りEntity Frameworkの使用を避けようとしています。 – BDW

+0

ああそうです。 m4tt1musのように、匿名のクラスの代わりに具体的なクラスを作成することができます。 –

+0

しかし、私はEntity Frameworkを使っています。私は複雑な型が格納されたprocsでどのように動作するかを知っていますが、それは問題ではありません。どのように私は複合型に上記の私は持っているSQLクエリにlinqをマップするのですか?私が努力しているものは何も働いていません。 – BDW

5

は、一般的に言えば、あなたは、サービスからドメインオブジェクトを返すべきではありませんもしあなたがそうしているのであれば、あなたが探しているような問題にぶつかるからです。ドメインオブジェクトは、問題のドメイン内の特定のエンティティを記述することを目的としており、しばしばサービスコールから戻る特定のデータセットを提供することにうまく適合しません。

data transfer objectsを作成して、転送する必要のある情報のみを含むドメインエンティティをサービスから切り離すことをお勧めします。 DTOには、ドメインオブジェクトを取得し、必要なプロパティ値をコピーするコンストラクタがあります(シリアル化できるようにパラメータのないコンストラクタも必要です)。AutoMapperのようなオブジェクトオブジェクトマッパを使用できます。また、IExtensibleDataObjectDataMemberAttributesのようなサービス固有の機能はドメインオブジェクトには適していません。これにより、サービスから送信するオブジェクトとは独立して、ドメインオブジェクトを自由に変更できます。

関連する問題