C# 返回C中匿名类型的集合

C# 返回C中匿名类型的集合,c#,collections,anonymous,C#,Collections,Anonymous,我有一个VS2010解决方案,由两个项目组成——一个数据项目和一个使用该数据项目的webservice项目。为了避免暴露数据库的模式,我选择将匿名var对象返回给web服务的使用者。我的问题是,我归还的一些东西将被收藏起来。因此,不要使用此代码返回单个匿名对象: var item = from w in db.Widgets where w.widget_id == 1 select new { name = w.name, address =

我有一个VS2010解决方案,由两个项目组成——一个数据项目和一个使用该数据项目的webservice项目。为了避免暴露数据库的模式,我选择将匿名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;
我意识到这不是正确的方法。。。我只是想知道到底该怎么做


谢谢

匿名类型本身不能在其声明函数之外公开,因此在声明函数之外公开匿名类型实例的唯一方法是作为对象。如果您需要这样做,您必须在更高的范围内声明一个具有所需属性的类型,然后在您的查询中使用它,而不是匿名类型。

我将使用一个返回的强类型层,而不是返回匿名类型。它仍然可以从数据库中以您想要的任何方式填充,并且您将为服务的消费者签订一份强有力的合同。消费者甚至不知道有数据库,它也可以是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();
}
然而,我不明白你为什么要这么做——打电话的人显然不能使用你的匿名类型,除非通过反射或其他黑客手段。为什么不简单地返回一个每个人都可以正常使用的普通类呢

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

如果返回的是匿名类型,调用方如何知道要使用哪些属性?