2013-04-29 2 views
0

Я создал небольшой тестовый класс, который возвращает данные из XML-файла.Linq с использованием предиката не работает

Теперь я хочу сделать его более динамичным с помощью linq, но не могу заставить его работать.

public class LenderCollection 
{ 
    string fileName = "C:\\Lenders.xml"; 

    public IEnumerable<Lender> Lenders { get; set; } 

    public void FetchLenders(Expression<Func<Lender, bool>> predicate = null) 
    { 
     IEnumerable<Lender> lenders = XmlHelper.GetObjectFromXml<List<Lender>>(fileName, "AllLenders"); 

     Lenders = predicate.IsNotNull() ? lenders.Where(predicate) : lenders; 

    } 
} 

Visual Studio дает ошибку в разделе «lenders.Where (предикат)» - сообщение «... не содержит определение Где ...»

Все идеи Я поступаю неправильно?

* UPDATE *

Кажется, что-то делать с предикатом - .где является avaialable иначе.

+0

Добавить 'using System.Linq;' и 'using System.Linq.Expressions;' в верхней части вашего файла – Andomar

+0

@Andomar - уже включено – dotnetnoob

+0

Кстати, вы всегда должны публиковать все сообщение об исключении. Хотя иногда и долго и трудно читать, он, вероятно, уже будет содержать решение вашей проблемы. – sloth

ответ

5

Там нет методы Where расширения, которое расширяет IEnumerable<T> и принимает параметр типа Expression<Func<T, bool>>.

У вас есть два варианта:

  1. использовать IQueryable<Lender> вместо IEnumerable<Lender> (вы можете это легко, просто позвонив .AsQueryable()), если вы тусклый, чтобы сохранить параметр predicate в Expression<Func<Lender, bool>>

  2. Используйте тип Func<Lender, bool> вместо Expression<Func<Lender, bool>> для параметра predicate. Поскольку вы загружаете свои данные из файла, нет смысла использовать IQueryable через IEnumerable.

+0

Благодаря dominic - оба работают, однако я использовал 2 по причинам, упомянутым вами. – dotnetnoob

0

Жалоба на то, что любой тип lenders не имеет метода .Where. Это либо потому, что:

  • Вы не включили using System.Linq;
  • Тип lenders не является IEnumerable или аналогичный.
+0

Aleady включает в себя пространство имен linq - см. Выше - переменные кредиторы IEnumerable dotnetnoob

-1

Заменить:

lenders.Where(predicate) 

С:

lenders.ToList().Where(predicate) 

Оба должны быть в состоянии вернуть IEnumerable.

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

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