Как использовать этот общедоступный IEnumerable‹T› Find(Expression‹Func‹T, bool›› предикат)?

Как правильно использовать приведенный ниже код?

public IEnumerable<T> Find(Expression<Func<T, bool>> predicate)

Мне нужно вернуть IEnumerable определенного объекта, но мне нужно преобразовать объект коллекции в Queryable и снова преобразовать результат в список?

Ниже показана моя реализация, я не знаю, правильно ли это, я использую код для модульного тестирования универсального репозитория.

 public IEnumerable<tbl_SBAem_Attendee> Find(Expression<Func<tbl_SBAem_Attendee, bool>> predicate)
        {
            var listtblsbaemAttendee = new  List<tbl_SBAem_Attendee>();
            IEnumerable<tbl_SBAem_Attendee> enumerableAttendee=new List<tbl_SBAem_Attendee>();


            for (var i = 0; i < 10; i++)
            {
                var tblSbAemAttendee = new tbl_SBAem_Attendee
                                           {
                                               AT_AID = i,
                                               AT_Address = "Address1" + i,
                                               AT_Address2 = "Address2" + i,
                                               AT_City = "City",
                                               AT_Email = "[email protected]",
                                               AT_EventID = null,
                                               AT_FirstName = "Rene" + i,
                                               AT_LastName = "Florendo" + i,
                                               AT_GID = null,
                                               AT_Org = "Rene's Club",
                                               AT_Phone = "888-8888",
                                               AT_Phone2 = "999-8888",
                                               AT_RegID = null,
                                               AT_SendInfo = null,
                                               AT_State = "NJ",
                                               AT_Title = "Mr",
                                               AT_Zip = "4102",
                                               AT_date = null,
                                               AT_opt1 = "option1",
                                               AT_opt2 = "option2",
                                               AT_opt3 = "option3",
                                               AT_opt4 = "option4",
                                               AT_opt5 = "option5",
                                               AT_opt6 = "option6",
                                               AT_userID = null,
                                               AttendeeID = 1
                                           };
                listtblsbaemAttendee.Add(tblSbAemAttendee);
            }
            var result= listtblsbaemAttendee.AsQueryable().Where(predicate);
            return result.ToList();
        }

Любая помощь или предложения высоко ценятся. Спасибо.


person user335160    schedule 12.04.2012    source источник


Ответы (1)


Если я не ошибаюсь:

Where(Expression<Func<T, bool>>) — это расширение для IQueryable

но

Where(Func<T, bool>>) — это расширение для IEnumerable.

Поэтому попробуйте изменить тип параметра вашей функции (или перегрузить его), и вам не нужно будет приводить к Queryable, чтобы использовать ваш предикат (не думайте, что вам нужно Expression)

ИЗМЕНИТЬ

Другой способ - скомпилировать ваше выражение (var predicatefunc = predicate.Compile()) и использовать его в предложении «Где». Но я не думаю, что это лучший выход...

person Raphaël Althaus    schedule 12.04.2012
comment
Это работает. Но почему большинство разработчиков предпочитает Expression‹Func‹T, bool››), а не Func‹T, bool›? - person user335160; 12.04.2012
comment
Большая часть разработчика не имеет большого значения ... Вы, конечно, смотрели на примеры функций, используемых для запросов к БД (таким образом, используя IQueryables, которые избегают извлечения данных из базы данных до того, как вы этого захотите), вот и все. - person Raphaël Althaus; 12.04.2012
comment
Спасибо. но я увидел ссылку, которая помогает мне понять stackoverflow.com /вопросы/3123164/ - person user335160; 12.04.2012