首页 > 解决方案 > 如何搜索数据库项的子字符串?

问题描述

我正在开发一个我不熟悉的 .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    

标签: c#sql.net

解决方案


这是我从你的问题中了解到的。您需要从数据库中保存的记录中搜索某些内容。例如,您将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操作。


推荐阅读