2016-01-02 10 views
2

Я пытаюсь реализовать сложный фильтр с использованием Entity Framework: я хочу добавить предложения where к запрашиваемому объекту на основании моих критериев поиска.Несколько предложений .Where() на платформе Entity Queryable

Могу ли я сделать следующее в Entity Framework 6?

var queryable = db.Users.Where(x => x.Enabled && !x.Deleted); 
// Filter 
var userId = User.Identity.GetUserId(); 
queryable.Where(x => x.AspNetUser.Id == userId); 
queryable.Where(x => x.Status >= 2); 
// ...etc 

Я знаю, что я могу сделать:

var queryable = db.Users 
.Where(x => x.Enabled && !x.Deleted) 
.Where(x => x.AspNetUser.Id == userId) 
.Where(x => x.Status >= 2); 

Но я не получаю ожидаемые результаты с этим решением. Кажется, что игнорируются две секунды: where.

+5

Вам необходимо присвоить результат, что-то вроде: 'запрашиваемых = queryable.Where (х => x.AspNetUser.Id == идентификатор пользователя),' Кстати, вы можете использовать 'и (&&)' и избегать написания нескольких предложений 'where'. – Akbari

+1

@Akbari, это должен быть ответ –

ответ

5

.Where возвращает запрос, он не изменяет оригинал. Поэтому вам просто нужно сохранить новый запрос.

var queryable = db.Users.Where(x => x.Enabled && !x.Deleted); 
// Filter 
var userId = User.Identity.GetUserId(); 
queryable = queryable.Where(x => x.AspNetUser.Id == userId); 
queryable = queryable.Where(x => x.Status >= 2); 
// ...etc 
+0

Aaah YES. Я так глуп. Я знал, что сделал это раньше, Но я не пропущу основы здесь. – Zapnologica

1

Я предполагаю, что вы пытаетесь найти время выполнения. Если это так, у вас есть два варианта.

  1. Использование выражений для создания времени выполнения, где условие. Возможно, вам придется использовать построитель предикатов. This Предикат-строитель может не работать с Entity Framework. Но this one должен работать с сущностью.

  2. Использование Dynamic Linq. Это намного проще. Это очень универсально. Мало того, что вы можете делать, где он поддерживает выбор и порядок, а также другие, а также время выполнения довольно легко !!! Посмотрите.