Как вернуть несколько классов как IQueryable <T> - PullRequest
3 голосов
/ 19 февраля 2010

Используя Linq, я хотел бы вернуть объект, который содержит клиентов и счета, которые у них есть.

Я понимаю возвращение одного типа из метода:

public IQueryable<customers> GetCustomers()
{
    return from c in customers
           select c;
}

Но у меня проблемы с определением нескольких объектов:

public IQueryable<???> GetCustomersWithInvoices()
{
    return from c in customers
           from inv in c.invoices
           select new {c, ci}  // or I may specify columns, but rather not.
}

У меня такое чувство, что я подхожу к этому неправильно. Цель состоит в том, чтобы вызвать эти объекты из контроллера и передать их в представление, либо прямое, либо с использованием класса formViewModel.

Ответы [ 3 ]

1 голос
/ 19 февраля 2010

Во втором случае вы создаете анонимный тип, который имеет область действия метода. Чтобы передать анонимный тип за границу метода, вам нужно изменить тип возвращаемого значения на объект. Это, однако, противоречит цели анонимного типа (поскольку вы теряете строгую типизацию, которую он обеспечивает), требуя отражения, чтобы получить доступ к свойствам и их значениям для указанного типа.

Если вы хотите сохранить эту структуру в качестве возвращаемого типа, вы должны создать класс или структуру, состоящую из свойств для хранения значений клиента и счета.

1 голос
/ 19 февраля 2010

Вы не можете вернуть анонимный тип из функции, это строго «встроенные» классы. Вам нужно будет создать конкретный тип для хранения ваших членов, если вы хотите инкапсулировать их в функцию.

Использование модели вида, как вы упомянули, было бы хорошим местом для их размещения.

Здесь - это статья о анонимных типах. Из заключения статьи:

Анонимные типы удобны языковая функция, которая позволяет разработчики, чтобы кратко определить inline Типы CLR в коде, не имея явно предоставить формальный класс объявление типа. Хотя они могут быть использованы во многих сценариях, особенно полезны, когда запрос и преобразование / формирование данных с LINQ.

В ветке комментариев на этой странице есть хорошее обсуждение.

0 голосов
/ 19 февраля 2010

Если вы действительно хотите, вы можете сделать это, но это довольно неловко.

public IQueryable<T> GetCustomersWithInvoices(T exampleObject)<br> {<br> return from c in customers<br> from inv in c.invoices<br> select new {c, ci} // or I may specify columns, but rather not.<br> }

var exampleObject = new {<br> Customer c = new Customer(),<br> Invoice i = new Invoice()<br> };
var returnedObjectOfAnonymousType = GetCustomersWithInvoices(exampleObject);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...