PredicateBuilder

233
07 мая 2018, 21:51

Нашёл пример как можно по частям собирать linq запрос. С помощью класса predicateBuilder. Нашёл тему на стеке

https://stackoverflow.com/questions/11490893/how-does-predicatebuilder-work

Но почему то так же не получается. Вот мой код:

Expression<Func<Cars, bool>> mark;
Expression<Func<Cars, bool>> carModel;
Expression<Func<Cars, bool>> year;
int rYear;
if(comboBox1.SelectedItem != null)
    mark = c => c.Mark == comboBox1.SelectedItem;
if (comboBox2.SelectedItem != null)
    carModel = m => m.CarModel == comboBox2.SelectedItem;
if (int.TryParse(textBox1.Text, out rYear))
    year = y => y.Equipment.ReleaseYear == rYear;
var filter = mark.And(mark);

Так же 1 параметр в методе And, но вылезает ошибка:

No overload for method 'And' takes 1 arguments

Нашёл пример на msdn что там должно быть 2 параметра, хотя тогда не понимаю как в примере работает с 1 параметром, но с 2 параметрами:

var filter = mark.And(mark, carModel);

тоже вылезает ошибка:

Member 'System.Linq.Expressions.Expression.And(System.Linq.Expressions.Expression, System.Linq.Expressions.Expression)' cannot be accessed with an instance reference; qualify it with a type name instead

Подскажите пожалуйста в чём проблема, что я делаю не так? Пример моего кода:

Expression<Func<Cars, bool>> filter = c => true;
            int rYear;
            if(comboBox1.SelectedItem != null)
                filter = filter.And(c => c.Mark == comboBox1.SelectedItem);
            if (comboBox2.SelectedItem != null)
                filter = filter.And(m => m.CarModel == comboBox2.SelectedItem);
            if (int.TryParse(textBox1.Text, out rYear))
                filter = filter.And(y => y.Equipment.ReleaseYear == rYear);
            List<Cars> cars = db.Cars.Where(filter).ToList();
            FillGrid(cars);

An unhandled exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll Additional information: Unable to create a constant value of type 'System.Data.Entity.DynamicProxies.Mark_2CE17B8870B608BFF2A3C17C9F7989059371DE18CEBDDB94D2AB8CC02E8785D2'. Only primitive types or enumeration types are supported in this context.

Работает фильтр:

int tmpValue = 0;
int.TryParse(comboBox1.SelectedValue.ToString(), out tmpValue);
List<Cars> cars = db.Cars.Where(c => c.MarkId == tmpValue).ToList();

Не работает фильтр:

Expression<Func<Cars, bool>> filter = c => true;
            int tmpValue = 0;
            if(comboBox1.SelectedItem != null)
            {
                int.TryParse(comboBox1.SelectedValue.ToString(), out tmpValue);
                filter = filter.And(c => c.MarkId == tmpValue);
            }
            if (comboBox2.SelectedItem != null)
            {
                int.TryParse(comboBox2.SelectedValue.ToString(), out tmpValue);
                filter = filter.And(m => m.CarModelId == tmpValue);
            }
            if (int.TryParse(textBox1.Text, out tmpValue))
                filter = filter.And(y => y.Equipment.ReleaseYear == tmpValue);
            List<Cars> cars = db.Cars.Where(filter).ToList();
READ ALSO
Ошибка при запуске консоли под .NET Framework на Debian

Ошибка при запуске консоли под .NET Framework на Debian

Появляется ошибка при запуске ConsoleApp2exe на Debian x86

224
Флаг закрытия SaveFileDialog WPF MVVM ICommand

Флаг закрытия SaveFileDialog WPF MVVM ICommand

Есть проблема при работе с SaveFileDialogПо задумке, при сохранении файла вывожу модальное окно с текстом "Успешно сохранено", в противном случае...

235
Нужны советы по unity 3d [требует правки]

Нужны советы по unity 3d [требует правки]

Недавно заинтересовался разработкой игр, очень понравился движок unity и решил изучать егоДля начала решил ознакомится с c# (по сайту mesharp

198
Помогите с разбором тестового задания C#, wpf, nhibernate, ioc, mvvm

Помогите с разбором тестового задания C#, wpf, nhibernate, ioc, mvvm

Выполнял тестовое задание при поиске работыРезультат моей работы никому не понравился, поэтому прошу помочь с разбором

197