Linq необязательные параметры

У меня есть запрос linq. У меня есть набор параметров из формы, которую я собираю для фильтрации по полям, которые ищет пользователь.

<code>IQueyable<Users> user = from user in edmxObject.Users
where user.FirstName.Contains(model.FirstName ?? user.FirstName)
&& user.UserName.Contains(model.UserName ?? user.UserName)
</code>

У меня есть еще несколько нестроковых фильтров полей, которые мне нужно отфильтровать, включая long и boolean. Они могут быть нулевыми, если пользователь ничего не выбирает. Как мне включить их в запрос.

 Jodrell05 апр. 2012 г., 17:37
Итакmodel класс имеет некоторые произвольные свойства, которые могут соответствовать атрибутамUser сущность или отношения крепче?
 Jodrell05 апр. 2012 г., 17:32
Этот список неизвестен? Как какой-то построитель запросов?

Ответы на вопрос(2)

Решение Вопроса

Это один из лучших примеров того, почему LINQ такой мощный - отложенное выполнение. Вы можете создать запрос на разных этапах, и только когда запрос будет окончательно выполнен или разрешен, будет сгенерирован оператор SQL:

var query = edmxObject.Users.AsQueryable<Users>();

if (! String.IsNullOrEmpty(model.FirstName)) {
    query = from user in query
            where user.FirstName.Contains(model.FirstName)
            select user;
}
if (! String.IsNullOrEmpty(model.UserName) {
    query = from user in query
            where user.UserName.Contains(model.UserName)
            select user;
}

// this will cause the query to execute get the materialized results
var result = query.ToList();
 05 апр. 2012 г., 17:10
@ Служба, я обновлен для этого. Хороший улов, спасибо!
 desiguy05 апр. 2012 г., 20:10
спасибо, что помогло.
 05 апр. 2012 г., 17:06
Это зависит от DataContext, но вам может потребоваться определитьquery какIQueryable<> вместо того, чтобы использоватьvar, Некоторые провайдеры имеют его как класс, который реализуетIQueryable<>, Вы также можете прикрепитьAsQueryable() послеUsers.
 05 апр. 2012 г., 17:08
Вы также можете использоватьquery = query.Where(u => u.FirstName.Contains(model.FirstName)); внутри вашего заявления if. Зависит от вашего предпочтительного синтаксиса.

Если запрос не включает в себя конкретное поле, вам вообще не нужно включать его как часть предложения where:

IQueyable<Users> user = from user in edmxObject.Users;

if (model.FirstName != null) 
    users = users.Where(user => user.FirstName.Contains(model.FirstName)

if (/* age is searched for */) 
    users = users.Where(user => user.Age == model.Age);

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

 desiguy05 апр. 2012 г., 20:11
спасибо, что помогло.

Ваш ответ на вопрос