Linq通配符搜索mvc c#

Posted

技术标签:

【中文标题】Linq通配符搜索mvc c#【英文标题】:Linq wild card search mvc c# 【发布时间】:2021-11-25 07:36:08 【问题描述】:

我正在尝试在 mvc 应用程序中使用 linq 实现通配符搜索。但它不工作。请查看我的代码,我在这里缺少什么,每次我单击搜索按钮时,它都会返回相同的行数。表示搜索不工作。请帮忙

IEnumerable<ProductList> listProducts = null;
listProducts = IProductRep.GetAllProducts();

if (listProducts != null)
               
    if ((!String.IsNullOrEmpty(strName)) || (!String.IsNullOrEmpty(strCategory))|| (!String.IsNullOrEmpty(strBrand)))
    
        listProducts = listProducts.Where(s => s.pro_name.StartsWith(strName, StringComparison.OrdinalIgnoreCase)
                        || s.CategoryName.StartsWith(strCategory,StringComparison.OrdinalIgnoreCase)
                        || s.BrandName.StartsWith(strBrand, StringComparison.OrdinalIgnoreCase)  );
    
    ViewBag.totalRecords = listProducts.Count();

【问题讨论】:

你确定strName、strCategori和strBrand有价值吗? 我试图只给出一个值,这意味着如果我想按品牌进行搜索,那么我只给出谷仓的价值并将其他参数留空。 为什么将null分配给listProducts,然后立即用IProductRep.GetAllProducts()覆盖它?只需分配即可。 未使用的过滤器变量是null 还是空的?如果null,EF 5 将忽略该部分测试,如果"",EF 5 将向SQL 发送为true 的代码。正在生成什么 SQL? 【参考方案1】:

您的问题似乎是并非所有strName, strCategory, strBrand 都有价值。 我假设你没有分配的变量是空字符串,因为如果它们是空值,你会得到ArgumentNullException on:

s.field.StartsWith(null, StringComparison.OrdinalIgnoreCase)

如果确实没有从 UI 中分配值的变量(或分配它的任何位置)是一个空字符串,那么 s.field.StartsWith(string.Empty, StringComparison.OrdinalIgnoreCase) 将始终为真(因为每个字符串都以空字符串开头) . 这意味着你得到了所有的记录。

您可以像这样将检查添加到 linq:

listProducts = listProducts
   .Where(s => !string.IsNullOrEmpty(strName) && s.pro_name.StartsWith(strName, StringComparison.OrdinalIgnoreCase) || 
...

【讨论】:

以上是关于Linq通配符搜索mvc c#的主要内容,如果未能解决你的问题,请参考以下文章

通配符搜索LINQ to SQL

LINQ 语句需要 Linq 通配符和 NOT 条件

执行通配符搜索

使用 C# 对 StackExchange.Redis 哈希中的字段进行通配符搜索

IIS 6 上的 ASP.NET MVC - 通配符映射 - 传入请求与任何路由都不匹配

通配符的匹配很全面, 但无法找到元素 'mvc:annotation-driven' 的声明