C# 在多个表上执行全文搜索

C# 在多个表上执行全文搜索,c#,asp.net,sql,C#,Asp.net,Sql,我在我的asp.net站点中实现了全文搜索,在搜索一个表时可以使用。但是,我希望用户能够同时搜索两个完全不同的表。我正在使用以下代码尝试此操作: public List<Article> Search(List<string> keywords) { StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.Append("select [aName],[aDesc]

我在我的asp.net站点中实现了全文搜索,在搜索一个表时可以使用。但是,我希望用户能够同时搜索两个完全不同的表。我正在使用以下代码尝试此操作:

  public List<Article> Search(List<string> keywords)
    { 
        StringBuilder sqlBuilder = new StringBuilder();
        sqlBuilder.Append("select [aName],[aDesc] from [Table1]  union select [bName],[bDesc] from [Table2] where");

        foreach (string item in keywords)
        {
            sqlBuilder.AppendFormat("([bName] like '%{0}%' or [bDesc] like '%{0}%') and ", item);
        }


       //foreach (string item in keywords)
        //{
            //sqlBuilder.AppendFormat("([aName] like '%{0}%' or [aDesc] like '%{0}%') and    ", item);
       //}


        string sql = sqlBuilder.ToString(0, sqlBuilder.Length - 4);
        return QueryList(sql);

    }
此代码始终显示第一个表中的所有记录,并且仅对第二个表执行搜索。这显然是因为sql语句中的第一个表没有“where”。我不知道如何使用不同的“foreach”循环为每个表实现“where”。有什么建议吗?

UNION将合并两个不同查询的结果。在每个查询完成执行后应用union,因此需要两个WHERE子句:

代码中最简单的实现是分别构建两个查询,然后将它们连接在一起:

StringBuilder sqlBuilder = new StringBuilder();
sqlBuilder.Append("select [aName],[aDesc] from [Table1] where ");
foreach (string item in keywords)
{
    sqlBuilder.AppendFormat(
        "([aName] like '%{0}%' or [aDesc] like '%{0}%') and ", item);
}

// That last "AND" requires a boolean statement to follow
// 1=1 will always return true and thus will not affect
// the result of your WHERE clause.
sqlBuilder.Append("1 = 1 ");

sqlBuilder.Append("UNION select [bName],[bDesc] from [Table2] where ");
foreach (string item in keywords)
{
    sqlBuilder.AppendFormat(
        "([bName] like '%{0}%' or [bDesc] like '%{0}%') and ", item);
}
foreach循环的替代方案:

但请注意,这将是一个效率极低的查询。如果你有超过几百行搜索,我强烈建议你考虑其他方法。< /P> 此外,您的计算机似乎容易受到攻击。除非事先已经手动擦除输入,否则应考虑


@BrianBrian-因为你的uncapped和,也许?你如何用1=1来限制它?@BrianBrian-更新了一个LINQ替代方案,以防你不喜欢查询中的1=1。我不得不改变表的顺序,但它是有效的!非常感谢你的帮助。我已经考虑过使用Lucene.Net,但在继续之前还需要做一些研究:
StringBuilder sqlBuilder = new StringBuilder();
sqlBuilder.Append("select [aName],[aDesc] from [Table1] where ");
foreach (string item in keywords)
{
    sqlBuilder.AppendFormat(
        "([aName] like '%{0}%' or [aDesc] like '%{0}%') and ", item);
}

// That last "AND" requires a boolean statement to follow
// 1=1 will always return true and thus will not affect
// the result of your WHERE clause.
sqlBuilder.Append("1 = 1 ");

sqlBuilder.Append("UNION select [bName],[bDesc] from [Table2] where ");
foreach (string item in keywords)
{
    sqlBuilder.AppendFormat(
        "([bName] like '%{0}%' or [bDesc] like '%{0}%') and ", item);
}
sqlBuilder.Append("select [aName],[aDesc] from [Table1] where ");
sqlBuilder.Append(
    string.Join(
        " and ",
        keywords.Select( k => string.Format( 
            "([aName] like '%{0}%' or [aDesc] like '%{0}%')", k )
        .ToArray()
    )
)

sqlBuilder.Append("UNION select [bName],[bDesc] from [Table2] where ");
sqlBuilder.Append(
    string.Join(
        " and ",
        keywords.Select( k => string.Format( 
            "([bName] like '%{0}%' or [bDesc] like '%{0}%')", k )
        .ToArray()
    )
)