C#多个Linq查询搜索问题

时间:2009-05-03 11:36:14

标签: c# linq linq-to-sql

我有多个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 个答案:

答案 0 :(得分:1)

您可以将它们组合成单个查询,只需应用条件(如果已设置):

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

因此,如果您搜索cond1 =“”和cond2 =“somevalue”,实际上您只搜索cond2。但如果同时指定两者,它将选择两个条件的交集。

添加一些检查以确保至少指定了一个条件。

答案 1 :(得分:0)

您是否考虑过让函数接受IQueryable作为参数而不是硬编码其中的GetTable?这将允许您通过将结果从一个函数传递给另一个函数的输入来组合查询。当然,在评估最终结果之前,查询仍然不会执行。