c# - 如何搜索数据库项的子字符串?
问题描述
我正在开发一个我不熟悉的 .NET 系统,我正在尝试解决一个问题,即当我搜索一个项目时,它只有在我输入初始字符时才有效。例如:如果我想搜索山狮并输入“狮子”,它只会列出狮子和狮子鱼。如果我输入“M”,它将在所有其他以 M 开头的动物中显示山狮。我希望它不管字符串位于项目上的什么位置都可以工作,因此它会返回某处包含“狮子”的每个项目。
这是一些代码,显示了它当前的工作方式。
[HttpPost]
public ActionResult PerformSearch(FormCollection collection)
{
var parameters = new List<DataAccessParameter>();
parameters.Add(new DataAccessParameter("@p_id_animal", System.Data.DbType.Int32, collection["id_animal"].ToDatabase()));
parameters.Add(new DataAccessParameter("@p_nm_animal", System.Data.DbType.String, collection["nm_animal"].ToUpper().ToDatabase())); //animal name
var list = DataHelper.Execute<BVAnimalSearch>(
System.Data.CommandType.StoredProcedure, "sp_search_animal", parameters,
dr => new BVAnimalSearch
{
id_doenca_animal = dr.ToInt("id_animal"),
nm_doenca_animal = dr.ToString("nm_animal"),
}).ToList();
return new ObjectResult<object>(new { success = true, data = list, total = list.Count });
}
[HttpPost]
public ActionResult ReturnSearch(List<BVAnimalSearch> listSelected)
{
var qry = from item in listSelected
select new BVAnimal
{
idAnimal = item.id_animal,
nmAnimal = item.nm_animal,
};
return new ObjectResult<ActionResponse>(new ActionResponse { success = true, data = qry });
}
我想知道如何修改此代码以完成我的要求。让我知道是否需要另一部分代码。
编辑:存储过程:
/****** Object: StoredProcedure [dbo].[sp_search_animal] ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_search_animal]
(
@p_id_animal int = null,
@p_nm_animal varchar(200) = null,
)
AS
DECLARE
@sql_where NVARCHAR(1000),
@sql_expr NVARCHAR(2000),
@sql_orderby NVARCHAR(500),
@sql_groupby NVARCHAR(500);
BEGIN
SET @sql_orderby = ' ORDER BY 1 ';
SET @sql_where = '';
IF @p_id_animal IS NOT NULL
set @sql_where = @sql_where + ' AND d.id_animal = @p_id_animal '
ELSE IF @p_nm_animal IS NOT NULL
set @sql_where = @sql_where + ' AND d.nm_animal LIKE @p_nm_animal +''%'' '
END
SET @sql_expr = @sql_expr + @sql_where + @sql_orderby;
EXECUTE sp_executesql @sql_expr,
N'@p_id_animal int = NULL,
@p_nm_animal VARCHAR(200) = NULL',
@p_id_animal,
@p_nm_animal
END
解决方案
这是我从你的问题中了解到的。您需要从数据库中保存的记录中搜索某些内容。例如,您将Loin作为输入传递,并从包含Loin的表的列中检索所有记录。
几天前,我实现了通配符搜索来做同样的事情。
我使用实体框架从表中检索记录并使用 LINQ 匹配记录。
如果任何列包含与搜索查询相关的一些信息,请将其添加到列表中。
var animals = await (from _a in _dbContext.animals
where ( _a.Name.Contains(searchQuery, StringComparison.InvariantCultureIgnoreCase))
select new Animal
{
/* properties of animal that you want to select */
}).ToListAsync();
其中 name 是表的列。您可以使用逻辑 OR 操作添加多个列,||
以检查要在其中搜索的表的多个列。
您也可以在存储过程中使用操作员执行此LIKE
操作。
推荐阅读
- java - 如何将 perl 脚本中的空字符串作为命令行参数传递给 java 文件
- excel - 在excel饼图中百分比的百分比?
- java - 詹金斯“无法安装 JDK”退出代码=-1
- python - 错误“numpy.float64'对象不能被解释为索引”可能与numpy版本有关吗?
- python - 无法使用 json.loads 将字符串加载到对象中
- javascript - 在多页上打印时,如何使 HTML 表格页脚占用每页上的可用空间?
- javascript - 2行第一列的Javascript平均值
- python-3.x - python:按平均朋友数划分年龄组
- vue.js - 如何使用vue.js获取段落中选择的文本的起始位置字符值
- mysql - 将 Pentaho 连接到 mysql 数据库(本地主机)