我正在使用C#ASP.NET并计划制作一个需要5个参数作为搜索条件的搜索功能 让我们使用3个条件来做例子:a,b和c
问题: 我是否需要使用以下所有7种搜索功能:
直接连接数据库(SQL)
或者是否可以从数据库创建表的列表(SQL) 并在C#aspx.cs中创建一个条件?
我不会询问示例代码,我只是要求提供简化编码搜索功能的概念,因为我至少有5个条件,这至少会让我这样做25种不同的搜索功能,可用于搜索的所有可能性。 感谢。
答案 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
中输入。如果@A
为0
,请设置@A = Null
。在(A=@A Or @A Is Null)
条件下工作就像一个可选的参数。如果@A
具有某个值,则条件将适用,如果它为null,则条件将忽略。您可以添加更多这样的参数。
Exec SP_Search 1,'',0
Exec SP_Search 1,'A',0
Exec SP_Search 1,'A',1
Exec SP_Search 1,'',1
Exec SP_Search 0,'A',0
Exec SP_Search 0,'A',1
Exec SP_Search 0,'',1
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();
}