C # Multiple Linq Query Search Проблема - PullRequest
1 голос
/ 03 мая 2009

У меня есть несколько запросов linq для поиска в базе данных информации на основе одного конкретного критерия для каждого запроса. например по ID или по имени и т. д.

В настоящее время пользователь может выполнять поиск, используя только один метод запроса. Проблема в том, что я хочу, чтобы пользователь мог выполнять поиск по нескольким критериям без необходимости писать новые запросы, объединяющие критерии из нескольких запросов.

Например:

Ниже у меня есть запрос, который возвращает набор вопросов на основе названия отдела, под которым они хранятся, и другой запрос, который возвращает набор вопросов на основе названия модуля, под которым хранятся вопросы. Поскольку в настоящее время пользователь может выполнять поиск только по названию отдела или по названию модуля, например, Компьютерные науки или распределенные системы, я хотел бы изменить это так, чтобы пользователь мог указать что-то вроде:

Вернуть все вопросы, которые имеют DepartmentName == Computer Science && ModuleTitle == Распределенные системы.

Помощь будет принята с благодарностью.

Вот текущий код:

//Department Name Query
public static IQueryable SearchByDepartmentNameInfo(string deptName)
    {

        ExamineDataContext dc = new ExamineDataContext();

        var queryResult = from q in dc.GetTable<Question>()
                          where q.Topic.Module.Department.DepartmentName.Equals(deptName)
                          join s in dc.Solutions
                          on q.QuestionID equals s.QuestionID
                          into qs // note grouping        
                          select new
                          {
                              Module = q.Topic.ModuleTitle,
                              Topic = q.TopicName,
                              Question = q.QuestionText,
                              QuestionType = q.QuestionType,
                          };
        return queryResult;
    }

    //Module Title Query
    public static IQueryable SearchByModuleTitleInfo(string modTitle)
    {

        ExamineDataContext dc = new ExamineDataContext();

        var queryResult = from q in dc.GetTable<Question>()
                          where q.Topic.Module.ModuleTitle.Equals(modTitle)
                          join s in dc.Solutions
                          on q.QuestionID equals s.QuestionID
                          into qs // note grouping        
                          select new
                          {
                              Module = q.Topic.ModuleTitle,
                              Topic = q.TopicName,
                              Question = q.QuestionText,
                              QuestionType = q.QuestionType,
                          };
        return queryResult;
    }

Ответы [ 2 ]

1 голос
/ 03 мая 2009

Вы можете объединить их в один запрос, только применив условие, если оно установлено:

where (cond1 == "" || row.field1 == cond1)
&& (cond2 == "" || row.field2 == cond2)
...

Так что, если вы ищете cond1 = "" и cond2 = "somevalue", то вы будете искать только на cond2. Но если вы укажете оба, он выберет пересечение обоих условий.

Добавьте несколько проверок, чтобы убедиться, что указано хотя бы одно условие.

0 голосов
/ 03 мая 2009

Рассматривали ли вы, чтобы функции принимали IQueryable в качестве параметра вместо жесткого кодирования GetTable внутри них? Это позволит вам комбинировать запросы, передавая результат из одной функции на вход другой. Конечно, запрос все еще не будет выполнен, пока вы не оцените окончательный результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...