【问题标题】:C# Multiple Linq Query Search IssueC# 多个 Linq 查询搜索问题
【发布时间】:2009-05-03 11:36:13
【问题描述】:

我有多个 linq 查询,用于根据每个查询的单个特定条件搜索信息数据库。例如按 ID 或按姓名等。

目前,用户只能使用一种查询方法进行搜索。问题是我希望用户能够使用多个条件进行搜索,而不必编写新的查询来组合来自多个查询的条件。

例如:

下面我有一个查询,它根据存储在其下的部门名称返回一组问题,另一个查询根据存储问题的模块标题返回一组问题。 由于目前用户只能按部门名称或模块标题搜索 - 例如计算机科学或分布式系统,我想更改它,以便用户可以指定如下内容:

返回所有属于 DepartmentName == 计算机科学 && 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;
    }

【问题讨论】:

  • 我很确定 DataContext 有一个 Dispose 方法,并保持实时数据库连接。让您的垃圾收集器管理您的数据库连接通常是个坏主意,就像您在这里所做的那样。

标签: c# linq linq-to-sql


【解决方案1】:

您可以将它们组合成一个查询,仅应用已设置的条件:

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

因此,如果您搜索 cond1="" 和 cond2="somevalue",实际上您只是在搜索 cond2。但是如果你同时指定,它会选择两个条件的交集。

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

【讨论】:

  • 感谢您的帖子,我有点困惑我究竟如何插入该代码以及应该参考什么 row.field1?
  • where (deptName == "" || q.Topic.Module.Department.DepartmentName.Equals(deptName)) && (modTitle == "" || q.Topic.Module.ModuleTitle.Equals (modTitle))
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 2021-02-06
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多