Как я могу отделить условие в запросе LINQ to SQL? - PullRequest
0 голосов
/ 15 октября 2011

Я использую ASP.NET с C #, и мне нужно, чтобы условие запроса было динамическим, Пример:
База данных:

 Name       Sex
 --------------
 John Doe    M
 Jane Doe    F

Теперь я хочу разрешить поиск по набору данных, но если пользователь выбирает поиск по имени ИЛИ по полу, только запрос разрешит поиск по столбцам имени или пола. Однако, если пользователь выберет поиск по имени и полу, запрос разрешит поиск по имени и полу. У меня вопрос: можно ли разделить запрос с помощью операторов if для учета динамического характера поиска? Спасибо.

Ответы [ 2 ]

3 голосов
/ 15 октября 2011

Вы можете сделать:

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 && r.Name == name);
0 голосов
/ 15 октября 2011

Стивен прав, это один хороший и простой способ сделать это, и он отлично подойдет для ваших нужд.Если вы когда-нибудь попадете в ситуацию, когда у вас может быть несколько условных операторов, было бы разумно изучить динамический 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

Удачи!

...