2011-01-14 14 views
2

"データ"プロジェクトとデータプロジェクトを使用するWebサービスプロジェクトの2つのプロジェクトからなるVS2010ソリューションがあります。データベースのスキーマを公開しないようにするために、Webサービスのコンシューマに匿名(var)オブジェクトを返すことを選択しました。私の質問は、私が返すもののいくつかはコレクションになるということです。だからではなく、単一の匿名オブジェクトを返すために、このコードを使用する:C#で匿名型のコレクションを返す

var item = from w in db.Widgets 
    where w.widget_id == 1 
    select new { 
     name = w.name, 
     address = w.address 
    }; 

私がコレクションを返すためにこれと同様のものを使用したいと思います。

IQueryable<var> item = (from w in db.Widgets 
     where w.widget_id == 1 
     select new { 
      name = w.name, 
      address = w.address 
     }).IQueryable; 

これはこれを行う正確な方法ではありません。実際にどのように行われるかを知る必要があります。

ありがとうございます!

+2

匿名型を返す場合、呼び出し元はどのプロパティを使用するのかをどのように知っていますか? –

答えて

4

匿名の型を返す代わりに、返される厳密な型指定されたレイヤーがあります。それはあなたが望む方法でデータベースからいっぱいになることができ、あなたはサービスの消費者に強い契約を結ぶことができます。消費者はデータベースがあることさえ知りませんし、xmlでもかまいません。

5

匿名型自体は宣言関数の外部に公開することはできません。したがって、匿名型のインスタンスを宣言する関数の外部に公開する唯一の方法は、objectです。これを行う必要がある場合は、必要なプロパティで上位スコープの型を宣言し、匿名型ではなくクエリ内で水和する必要があります。

3

あなたは、理論的には、これを行うことができます:

public List<object> GetObjects() 
{ 
    return (from w in db.Widgets 
     where w.widget_id == 1 
     select (object) new { 
      name = w.name, 
      address = w.address 
     }).ToList(); 
} 

をあなたがこれやりたい理由しかし、私は理解していない - 呼び出し側が明らかにあなたの匿名型のいずれかの利用を行うことはできませんが、リフレクションや他のハッキーなものを除いて。誰もが普通に使うことができる普通のクラスを返してみませんか?

public class NameAndAddress 
{ 
    public string Name { get; private set; } 
    public string Address { get; private set; } 
    public NameAndAddress(string name, string address) 
    { 
     Name = name; 
     Address = address; 
    } 
} 

public List<NameAndAddress> GetObjects() 
{ 
    return (from w in db.Widgets 
     where w.widget_id == 1 
     select new NameAndAddress(w.name, w.address) 
    ).ToList(); 
} 
関連する問題