我正在使用一个我不熟悉的.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
答案 0 :(得分:1)
这是我从您的问题中了解的内容。
您需要从数据库中保存的记录中搜索内容。
例如您正在传递 Loin 作为输入,并从其中具有 Loin 的表的列中检索所有记录。
几天前,我实施了WildCard搜索以执行相同的操作。
我使用实体框架从表中检索记录,并使用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是表的列。您可以使用逻辑或操作||
添加多个列,以检查要搜索的表的多个列。
您还可以使用LIKE
运算符在存储过程中执行此操作。
答案 1 :(得分:1)
已经解决了。当评论提到存储过程时,我意识到问题出在哪里。 只需更改此行,并在字符串之前添加%。
set @sql_where = @sql_where + ' AND d.nm_animal LIKE ''%''+ @p_nm_animal +''%'' '
谢谢。