我有一个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;
我意识到这不是确切的方法......只需要知道它将如何实现。
谢谢!
答案 0 :(得分:5)
匿名类型本身不能在其声明函数之外公开,因此在声明函数之外公开匿名类型实例的唯一方法是object
。如果你需要这样做,你必须使用你需要的属性在更高的范围声明一个类型,然后在查询中而不是匿名类型中对它进行水合。
答案 1 :(得分:4)
我没有返回匿名类型,而是返回了一个强类型图层。它仍然可以以您想要的任何方式从数据库中填充,并且您与服务的消费者签订了强有力的合同。消费者甚至不知道有数据库,它也可能是xml。
答案 2 :(得分: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();
}
但是,我不明白你为什么要这样做 - 调用者显然无法使用你的匿名类型,除非通过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();
}