2

我有一个 VS2010 解决方案,由两个项目组成——一个“数据”项目和一个使用数据项目的 web 服务项目。为了防止暴露数据库的架构,我选择将匿名 (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();
}

但是,我不明白您为什么要这样做——调用者显然无法使用您的匿名类型,除非通过反射或其他 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();
}
于 2011-01-14T16:06:45.917 回答