搜索功能的概念

时间:2017-05-02 03:59:41

标签: c# asp.net visual-studio

我正在使用C#ASP.NET并计划制作一个需要5个参数作为搜索条件的搜索功能 让我们使用3个条件来做例子:a,b和c

问题: 我是否需要使用以下所有7种搜索功能:

直接连接数据库(SQL)

  1. 根据条件a
  2. 搜索结果
  3. 条件a +条件b
  4. 条件a +条件b +条件c
  5. 条件a +条件c
  6. 仅限条件b
  7. 条件b +条件c
  8. 仅限条件c
  9. 或者是否可以从数据库创建表的列表(SQL) 并在C#aspx.cs中创建一个条件?

    我不会询问示例代码,我只是要求提供简化编码搜索功能的概念,因为我至少有5个条件,这至少会让我这样做25种不同的搜索功能,可用于搜索的所有可能性。 感谢。

2 个答案:

答案 0 :(得分:3)

可以从数据库(SQL)做,它将是最好的解决方案。您必须为此创建Stored Procedure,如下所示。

SQL:

Create Proc SP_Search(@A Int, @B NVarChar(20), @C Int)
    As
Begin
    If @A = 0 Set @A = Null
    If @B = '' Set @B = Null
    If @C = 0 Set @C = Null

    Select * From Table Where (A=@A Or @A Is Null) And (B=@B Or @B Is Null) And (C=@C Or @C Is Null)
End

让我解释一下上面的SQL。它将在参数@A@B@C中输入。如果@A0,请设置@A = Null。在(A=@A Or @A Is Null)条件下工作就像一个可选的参数。如果@A具有某个值,则条件将适用,如果它为null,则条件将忽略。您可以添加更多这样的参数。

  1. 仅根据条件a搜索结果 Exec SP_Search 1,'',0
  2. 条件a +条件b Exec SP_Search 1,'A',0
  3. 条件a +条件b +条件c Exec SP_Search 1,'A',1
  4. 条件a +条件c Exec SP_Search 1,'',1
  5. 仅限条件b Exec SP_Search 0,'A',0
  6. 条件b +条件c Exec SP_Search 0,'A',1
  7. 仅限条件c Exec SP_Search 0,'',1
  8. C#代码调用Stored Procedure

    int A = 1;
    string B = "A";
    int C = 1;
    using (SqlConnection conn = new SqlConnection("Connection String")) {
        conn.Open();
        SqlCommand cmd  = new SqlCommand("SP_Search", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new SqlParameter("@A", A));
        cmd.Parameters.Add(new SqlParameter("@B", B));
        cmd.Parameters.Add(new SqlParameter("@C", C));
        using (SqlDataReader reader = cmd.ExecuteReader()) {
            while (reader.Read())
            {
                //Read Your Data Here
            }
        }
    }
    

答案 1 :(得分:0)

不,您不需要为所有可能的组合使用某些特殊功能。而且,这将是非常多的功能。

您可以检查一下要指定的条件并添加此条件 像这样:

public YourEntity[] Search(string name = "", int? age = null, bool? isActive = null)
{
    string query = "SELECT * FROM YourEntities";
    List<string> whereConditions = new List<string>();

    if (!string.IsNullOrWhiteSpace(name))
    {
        whereConditions.Add($"name LIKE '%{name}%'");
    }

    if (age.HasValue)
    {
        whereConditions.Add($"age = {age.Value}");
    }

    if (isActive.HasValue)
    {
        whereConditions.Add($"isActive = {isActive.Value:D}");
    }

    if (whereConditions.Any())
    {
       query += "WHERE " + string.Join(" AND ", whereConditions);
    }

    return someSqlExecutorAndProcessor(query);
}

然后,您可以像这样使用此方法:

var results = Search(); // all
var results = Search("name"); // name only
var results = Search(age: 17); // age only
var results = Search("name", isActive: true); // name and isActive

重要说明:请注意,此代码使用字符串连接来构建SQL查询,这不安全,它只是提供一般想法的最小示例。我只是不知道你使用什么来处理数据库。请改用参数化查询或ORM。

例如,如果您使用Entity Framework,它将如下所示:

public YourEntity[] Search(string name = "", int? age = null, bool? isActive = null)
{
    IQueryable<YourEntity> entities = dbContext.Set<YourEntity>();

    if (!string.IsNullOrWhiteSpace(name))
    {
        entities = entities.Where(x => x.Name.Contains(name));
    }

    if (age.HasValue)
    {
        entities = entities.Where(x => x.Age == age.Value);
    }

    if (isActive.HasValue)
    {
        entities = entities.Where(x => x.IsActive == isActive.Value);
    }

    return entities.ToArray();
}