2

「データ」プロジェクトとデータプロジェクトを使用するWebサービスプロジェクトの2つのプロジェクトで構成されるVS2010ソリューションがあります。データベースのスキーマを公開しないように保護するために、匿名(var)オブジェクトをWebサービスのコンシューマーに返すことを選択しました。私の質問は、私が返すもののいくつかはコレクションにあるということです。したがって、このコードを使用して単一の匿名オブジェクトを返す代わりに、次のようにします。

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;

私はこれがこれを行う正確な方法ではないことを理解しています...それが実際にどのように行われるかを知る必要があります。

ありがとう!

4

3 に答える 3

5

匿名型自体を宣言関数の外部に公開することはできないため、匿名型のインスタンスを宣言関数の外部に公開する唯一の方法は、としてobjectです。これを行う必要がある場合は、必要なプロパティを使用してより高いスコープで型を宣言し、匿名型ではなくクエリ内でそれをハイドレイトする必要があります。

于 2011-01-14T15:59:02.440 に答える
4

匿名型を返す代わりに、返される強い型付きレイヤーがあります。それでも、データベースから任意の方法で入力でき、サービスの利用者と強力な契約を結ぶことができます。消費者はデータベースがあることすら知りません。それはxmlである可能性もあります。

于 2011-01-14T15:59:36.097 に答える
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();
}
于 2011-01-14T16:06:45.917 に答える