2010-08-12 15 views
1

У меня есть следующий код: -Как получить поля данных из переменной IQueryable?

public IQueryable GetPerson(int PersonID) 
    { 

     var Details = from pers in db.People 
       where pers.ID == PersonID 
         select new 
          { 
           Name = item.NAME, 
           Email = item.EMAIL 
          }; 

     return Details 
    } 

Я не хочу, чтобы вернуть конкретный тип из кода доступа к данным выше.

Тогда я хочу сделать что-то вроде:

IQueryable Person = dal.GetPerson(PersonID); 
PersonEmail = Person.EMAIL; - but this obviously doesn't work ?? 

Любые идеи о том, как я могу получить данные поля из объекта Person IQueryable?

ответ

2

На практике вы не можете возвращать анонимный тип из метода любым полезным способом. Вы будете компилировать и работать, но у вас по существу есть коллекция объектов IQueryable, и вы не можете получить доступ к свойствам анонимных типов, содержащихся в нем. Если вы не вернетесь IQueryable<Person>, вы просто не можете получить доступ к свойствам возвращаемого объекта, анонимные типы действительно полезны только в пределах области, которую они создают. Возможно, что-то ужасное, что вы могли бы сделать с размышлением, чтобы получить данные, но я бы не рекомендовал идти по этому маршруту. Почему вы не хотите возвращать IQueryable<Person>?

+0

Причина, по которой я не возвращаю IQueryable , заключается в том, что я создаю объединение LINQ в классе доступа к данным и не хочу создавать определенный тип класса, чтобы вернуть это и связанные поля ... но это звучит как I возможно, придется ??? – cyberbobcat

+0

Да, вам нужно будет создать новый класс, который содержит свойства обоих классов. –

+0

Хорошо, спасибо за вашу помощь. – cyberbobcat

-2

Вопрос заключается в том, что IQueryable представляет собой коллекцию: в данном случае IQueryable<[annonymous]> или что-то подобное.

Попробуйте использовать IEnumerable как ваше возвращение типа вместо, а затем сделать:

IEnumerable foundPerson = dal.GetPerson(personId); 
string PersonEmail = foundPerson[0].Email; 

Примечание: Вы можете быть в состоянии сделать это с IQueryable, а также: Я никогда не пробовал, и я не глядя документация для интерфейса на данный момент.

Исправление: поскольку метод GetPerson() является собственным методом, вы теряете свой анонимный тип и получаете только объект назад. Самый простой способ исправить это - использовать именованный тип (класс или структура), хотя, видимо, есть некоторые хаки (не рекомендуется), которые позволяют обойти это.

Другим вариантом может быть выражение Lambda, которое отталкивает данные, которые вам нужны в каждом конкретном случае, но тогда у вас, вероятно, будет справедливое количество повторений кода.

+0

Это не сработает. IEnumerable не поддерживает индексирование, даже если оно не было, и не будет электронной почты, потому что элемент будет объектом, который не имеет свойства электронной почты. –

+0

@Ben - Ах, вы правы: поскольку GetPerson() - это собственный метод ... не учитывается эта часть. – AllenG

Смежные вопросы