簡體   English   中英

在C#中返回匿名類型的集合

[英]Returning collection of anonymous types in C#

我有一個VS2010解決方案,包含兩個項目 - 一個“數據”項目和一個使用數據項目的Web服務項目。 為了防止暴露數據庫的模式,我選擇將匿名(var)對象返回給webservice的使用者。 我的問題是,我返回的一些內容將在收藏中。 因此,而不是使用此代碼返回單個匿名對象:

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;

我意識到這不是確切的方法......只需要知道它將如何實現。

謝謝!

匿名類型本身不能在其聲明函數之外公開,因此在聲明函數之外公開匿名類型實例的唯一方法是作為object 如果需要這樣做,則必須使用所需的屬性在更高的范圍內聲明類型,然后在查詢中而不是匿名類型中對其進行水合。

我沒有返回匿名類型,而是返回了一個強類型層。 它仍然可以以您想要的任何方式從數據庫中填充,並且您與服務的消費者簽訂了強有力的合同。 消費者甚至不知道有數據庫,它也可能是xml。

理論上,你可以這樣做:

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();
}

但是,我不明白你為什么要這樣做 - 調用者顯然無法使用你的匿名類型,除非通過Reflection或其他hacky東西。 為什么不簡單地返回一個每個人都能正常使用的普通課程?

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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM