Возврат коллекции анонимных типов в C # - PullRequest
2 голосов
/ 14 января 2011

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

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;

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

Спасибо!

Ответы [ 3 ]

5 голосов
/ 14 января 2011

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

4 голосов
/ 14 января 2011

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

3 голосов
/ 14 января 2011

Теоретически вы можете сделать это:

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