繁体   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