2011-01-14 3 views
2

У меня есть решение VS2010, состоящее из двух проектов - проекта «данных» и проекта webservice, который потребляет проект данных. Чтобы защитить вас от выставления схемы базы данных, я решил вернуть анонимные (var) объекты потребителю веб-сервиса. Мой вопрос: некоторые из тех, что я возвращаю, будут в коллекциях. Таким образом, вместо того, чтобы использовать этот код, чтобы вернуть один анонимный объект:Возвращение коллекции анонимных типов в C#

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; 

Я понимаю, что это не точный способ сделать это ... просто нужно знать, как это действительно будет сделано.

Спасибо!

+2

Если вы возвращаете анонимные типы, как вызывающий может узнать, какие свойства использовать? –

ответ

4

Вместо того, чтобы возвращать анонимные типы, у меня будет сильный напечатанный слой, который будет возвращен. Он по-прежнему может быть заполнен из базы данных в зависимости от того, какой вы хотите, и у вас будет сильный контракт для потребителя услуги. Потребитель даже не знает, что есть база данных, она также может быть xml.

5

Анонимные типы сами не могут быть выставлены вне их функции объявления, поэтому единственный способ разоблачить экземпляр анонимного типа вне функции объявления - это object. Если вам нужно это сделать, вам придется объявить тип с более высокой областью с требуемыми свойствами, а затем убрать его в свой запрос, а не анонимный тип.

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 или другие взломанные вещи. Почему бы просто не вернуть обычный класс, который каждый может использовать нормально?

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(); 
} 
Смежные вопросы