Как я могу вернуть анонимный тип из метода?

У меня есть запрос Linq, который я хочу вызвать из нескольких мест:

var myData = from a in db.MyTable
             where a.MyValue == "A"
             select new  {
                            a.Key,
                            a.MyValue
                          };

Как я могу создать метод, поместить в него этот код, а затем вызвать его?

public  ???  GetSomeData()
{
   // my Linq query
}

person ScottG    schedule 10.09.2008    source источник
comment
Почему бы тебе не вернуть Diction‹K,V›?   -  person Darren Kopp    schedule 11.09.2008
comment
это был просто простой пример. У меня есть гораздо больше значений, которые я на самом деле выбираю, но которые не вписываются в словарь.   -  person ScottG    schedule 11.09.2008
comment
возможный дубликат Вернуть анонимный тип?   -  person nawfal    schedule 28.06.2014


Ответы (4)


IQueryable и IEnumerable работают. Но вы хотите использовать конкретную версию типа, IQueryable<T> или IEnumerable <T>.

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

var myData = from a in db.MyTable
             where a.MyValue == "A"
             select new MyType
             {
                 Key = a.Key,
                 Value = a.MyValue
             };
person Darren Kopp    schedule 10.09.2008
comment
Большое СПАСИБО за расширение этого решения. Ключ использовал определенный тип. Это отлично работает - person ScottG; 11.09.2008
comment
Эй, я дал этот ответ за 1 час до Даррена. Поделом со мной, что не дал образец :) - person Gulzar Nazim; 11.09.2008
comment
Чтобы было ясно, что происходит, так это то, что select new {...} создает анонимный тип (требующий использования ключевого слова var). Этот тип не имеет имени и может использоваться только локально в методе, который его создал (если вы не используете отражение). Чтобы использовать его снаружи, вам нужно создать именованный тип. - person Lucas; 07.10.2008

IQueryable

Таким образом, объявление вашего метода будет выглядеть так

public IQueryable GetSomeData()
person Ryan Lanciaux    schedule 10.09.2008
comment
Делая это, вы не будете иметь intellisense и сможете получить доступ к свойствам элементов только через отражение. - person Darren Kopp; 11.09.2008
comment
Имейте в виду, что запрос еще не запущен. - person Eduardo Molteni; 11.09.2008
comment
Да, я только что заметил это .. У меня нет intellisense. Должен быть лучший способ. - person ScottG; 11.09.2008
comment
Это зависит от вашего определения лучшего пути. Ленивая загрузка удобна во многих случаях. - person Ryan Lanciaux; 11.09.2008

Общий метод должен дать вам intellisense:

public class MyType {Key{get;set;} Value{get;set}}

public IQueryable<T> GetSomeData<T>() where T : MyType, new() 
 { return from a in db.MyTable
          where a.MyValue == "A" 
          select new T {Key=a.Key,Value=a.MyValue};
 }
person Mark Cidade    schedule 10.09.2008

Если вы хотите вернуться, вам нужен тип.

Вместо var объявите с помощью IEnumerable<> и верните эту переменную. Итерация по нему фактически выполняет запрос.

person Gulzar Nazim    schedule 10.09.2008