微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Dapper 添加搜索功能

如何解决使用 Dapper 添加搜索功能

我对 Dapper 和 MVC 还很陌生,但我一直在做研究,到目前为止在我正在构建的这个小应用程序中做得很好。

因此,我最近将我的代码库重新安排为存储库模式,因为我没有使用实体框架并且它运行良好。

但我正在努力解决如何在我的索引页面上实现搜索功能以将匹配结果返回到列表中。

下面是我的 IRepository.cs

    public interface IRepository<T> where T : BaseEntity
    {
        Task<List<T>> GetAllAsync();

        Task<T> GetByIdAsync(int id);

        Task<T> GetByNameAsync(string searchText);
    }
}

下面是我的 ShowRepository.cs

    public class ShowRepository : BaseRepository,IShowRepository
    {
        public ShowRepository(IConfiguration configuration)
            : base(configuration)
        {
        }
        public async Task<Show> GetByNameAsync(string searchText)
        {
            try
            {
                var query = "SELECT * FROM vwShows WHERE show_name LIKE '%' + @show_name + '%' ";

                var parameters = new DynamicParameters();
                parameters.Add("show_name",searchText,DbType.String);

                using (var connection = CreateConnection())
                {
                    return (await connection.QueryFirstOrDefaultAsync<Show>(query,parameters));
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message,ex);
            }
        }

下面是我的 ShowService.cs

    public class ShowService : IShowService
    {
        private readonly IShowRepository _showRepository;

        public ShowService(IShowRepository showRepository)
        {
            _showRepository = showRepository;
        }

        public async Task<Show> GetShowByName(string searchText)
        {
            return await _showRepository.GetByNameAsync(searchText);
        }

下面是我的 ShowController.cs

    public class ShowController : Controller
    {
        private readonly IShowService _showService;

        public ShowController(IShowService showService)
        {
            _showService = showService;
        }

        // Get All Shows - Works Perfectly
        public async Task<IActionResult> Index()

        {
            return View(await _showService.GetAllShows());
        }

        // Get Shows by Show ID - Works Perfectly
        public async Task<IActionResult> Details(int id)

        {
            return View(await _showService.GetShowById(id));
        }

        // Get Shows by Show Name - Does Not Work
        public async Task<IActionResult> Results(string searchText)
        {
            if (!String.IsNullOrEmpty(searchText))
            {
                return Results(await _showService.GetShowByName(searchText));
            }
        }

最后,下面是搜索按钮的代码。它是我共享导航栏的一部分,因此我试图根据我所在的控制器和操作使其动态化。

<form class="d-flex" asp-controller=@ViewData["Controller"] asp-action=@ViewData["Action"]>
    <input class="form-control me-sm-2" type="text" placeholder="Search @ViewData["Controller"]" name="searchText">
    <button class="btn btn-secondary my-2 my-sm-0" type="submit"> Search </button>
</form>

错误消息引用了我的“查看”页面,它抛出了一个关于参数“源”的空异常错误。下面是我的错误堆栈的一小段(如果它可以帮助任何能够理解它的人)。

ArgumentNullException: Value cannot be null. (Parameter 'source')

System.Linq.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
System.Linq.Enumerable.Count<TSource>(IEnumerable<TSource> source)
AspNetCore.Views_Show_Index.ExecuteAsync() in Index.cshtml
+
@if (Model.Count() > 0)
Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageCoreAsync(IRazorPage page,ViewContext context)
Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageAsync(IRazorPage page,ViewContext context,bool invokeViewStarts)
Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderAsync(ViewContext context)

为了解决这个问题,我在视图顶部添加一个“@if (Model.Count() > 0)”,以返回一条简单的消息,说明没有数据。

但是,数据库中有 100% 的数据从我的控制器返回我的 GetAllShows 方法的“Foreach” - 这只是我需要帮助的搜索功能

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。