#c# #asp.net #sql #database #linq-to-sql
#c# #asp.net #sql #База данных #linq-to-sql
Вопрос:
Я использую ASP.NET с помощью C # и мне нужно сделать условие запроса динамическим, пример:
База данных:
Name Sex
--------------
John Doe M
Jane Doe F
Теперь я хочу разрешить поиск в наборе данных, но если пользователь выберет поиск только по имени ИЛИ полу, запрос разрешит поиск по столбцам name или sex. Однако, если пользователь выберет поиск как по имени, так и по полу, запрос разрешит поиск по имени и по столбцу пола. Мой вопрос в том, могу ли я разделить запрос с помощью операторов if для учета динамического характера поиска? Спасибо.
Ответ №1:
Вы можете сделать:
var q = ...;
if(sex != null) {
q = q.Where(r => r.Sex == sex);
}
if(name != null) {
q = q.Where(r => r.Name == name);
}
Это будет фильтроваться по полу и / или имени в зависимости от того, что передается.
q = q.Where(r => r.Sex == sex).Where(r => r.Name == name);
это то же самое, что
q = q.Where(r => r.Sex == sex amp;amp; r.Name == name);
Комментарии:
1. Спасибо за быстрый ответ, я новичок в linq-to-sql, поэтому у меня возникли трудности с этим, еще раз спасибо, очень признателен
Ответ №2:
Стивен прав, это один хороший и простой способ сделать это, и он отлично подойдет для ваших нужд. Если вы когда-нибудь попадете в ситуацию, когда у вас может быть несколько условных операторов, было бы разумно изучить динамический linq. Динамический linq позволит вам написать запрос, такой как:
DatabaseDataContext db = new DatabaseDataContext();
string WhereClause = string.Empty;
if (!string.IsNullOrEmpty(Name))
WhereClause = "Name.ToLower().Contains("" Name.ToLower() "") AND ";
if (!string.IsNullOrEmpty(State))
WhereClause = "City.State.Name.ToLower().Contains("" State.ToLower() "") AND ";
if (!string.IsNullOrEmpty(County))
WhereClause = "City.County.Name.ToLower().Contains("" County.ToLower() "") AND ";
if (!string.IsNullOrEmpty(City))
WhereClause = "City.Name.ToLower().Contains("" City.ToLower() "") AND ";
if (WhereClause.EndsWith(" AND "))
WhereClause = WhereClause.Remove(WhereClause.Length - 5);
var query = db.Communities
.Where(WhereClause)
.OrderBy("Name");
Вы можете получить динамический класс linq здесь http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
Удачи!