【问题标题】:Linq wild card search mvc c#Linq通配符搜索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?

标签: entity-framework linq asp.net-mvc-5


【解决方案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) || 
...

【讨论】:

    猜你喜欢
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2013-05-02
    • 1970-01-01
    • 2014-02-11
    相关资源
    最近更新 更多