如何在LINQ命令中避免空值?

时间:2014-03-08 05:16:25

标签: c# linq entity-framework-4 linq-to-entities

我正在尝试使用实体框架从列表中搜索对象。

我有以下对象的结构

public class Product
{
    public int Id { get; set; }
    public string ProductName { get; set; }
    public double Size { get; set; }
}

我创建了产品列表

private List<Product> AddProducts()
{
    List<Product> ProductList = new List<Product>();

    oProduct Product = new Product();
    oProduct.Id = 1;
    oInventory.ProductName = "Product1";
    oProduct.Size = 25;
    ProductList.Add(oProduct);

    oProduct Product = new Product();
    oProduct.Id = 2;
    oInventory.ProductName = "Product2";
    oProduct.Size = 25;
    ProductList.Add(oProduct);

    return ProductList;           
}

现在,我正在尝试从上面的列表形式ProductName参数中搜索对象。

我使用了下面的代码。

public ActionResult Index(string productname = "", string size = "")
{
    var oProdList = from ProdList in AddProducts() select oProdList;
    oProdList = oProdList.Where(oProd => oProd.ProductName.ToUpper().Contains(ProductName.ToUpper().Trim())|| oProd.Size.ToString().ToUpper().Contains(size.ToUpper().Trim()));
    ViewBag.ProductList = oProdList;
    return View();
}

现在请查看下面的图片,我有产品列表,我试图通过在文本框中键入来找到Product1,并且我将大小文本框保留为空白。 现在,当我点击提交时,我传递这两个变量用于在Index方法(上面一个)中搜索,但LINQ命令返回两个记录,Product1和Product 2 但它应该只返回一个记录

如何处理?

enter image description here

6 个答案:

答案 0 :(得分:2)

这对我有用,是搜索算法应该如何工作的。如果参数都提供了&&参数,但如果缺少其中一个参数,则需要||

另外值得注意的是,“{2}”的输入与size的“25”匹配,因为我们正在执行Contains。如果您希望它仅在您输入“25”而不是“2”时匹配,则将其设置为==而不是Contains。同样适用于productname

public class Product
{
  public int Id { get; set; }
  public string ProductName { get; set; }
  public double Size { get; set; }
}

private List<Product> AddProducts()
{
  List<Product> ProductList = new List<Product>();

  var p = new Product();
  p.Id = 1;
  p.ProductName = "Product1";
  p.Size = 25;
  ProductList.Add(p);


  var p2 = new Product();
  p2.Id = 2;
  p2.ProductName = "Product2";
  p2.Size = 25;
  ProductList.Add(p2);

  return ProductList;           
}

public ActionResult Index(string productname = "", string size = "")
{
  var oProdList = from p in AddProducts() select p;

  if (!string.IsNullOrWhiteSpace(productname) && !string.IsNullOrWhiteSpace(size))
  {
     oProdList = oProdList.Where(p => p.ProductName.ToUpper().Trim().Contains(productname.ToUpper().Trim()) && p.Size.ToString().Contains(size.Trim()));
  }
  else
  {
    oProdList = oProdList.Where(p => !string.IsNullOrWhiteSpace(productname) ? p.ProductName.ToUpper().Trim().Contains(productname.ToUpper().Trim()) : p.ProductName.ToUpper().Trim() == productname.ToUpper().Trim() || !string.IsNullOrWhiteSpace(size) ? p.Size.ToString().Contains(size.Trim()) : p.Size.ToString() == size.Trim());
  }

  ViewBag.ProductList = oProdList;
  return View();
}

答案 1 :(得分:1)

发生这种情况,因为每个字符串值都包含字符串空 并且您的参数大小默认值设置为string.empty 所以你应该检查它是否过滤了这样的结果

    oProdList = oProdList.Where(
        oProd =>(productname == string.Empty ? false:
                oProd.ProductName.ToUpper().Contains(productname.ToUpper().Trim()))
                || (size == string.Empty ? false:oProd.Size.ToString().
                ToUpper().Contains(size.ToUpper().Trim()))
        );

答案 2 :(得分:0)

我认为原因可能是因为您正在将大小转换为字符串

试试这个

public ActionResult Index(string productname = "", string size = "0")
        {
            var oProdList = from ProdList in AddProducts() select oProdList;


      oProdList = oProdList.Where(oProd => oProd.SectionName.ToUpper().Contains(ProductName.ToUpper().Trim())|| oProd.Size == (double)size));


            ViewBag.ProductList = oProdList;
            return View();

        }

答案 3 :(得分:0)

如果搜索参数为空,则需要指定忽略搜索。

试试这个:

var productList = from ProdList in AddProducts()
where (productname.Trim() == string.Empty || ProdList.ProductName.ToUpper().Contains(ProductName.ToUpper().Trim()))
&& (size.Trim() == string.Empty || ProdList.Size.ToString().ToUpper().Contains(size.ToUpper().Trim()))
select ProdList;

答案 4 :(得分:0)

您可以在此处使用空合并运算符。

    oProdList = oProdList.Where(oProd => (!String.IsNullOrEmpty((ProductName??"").Trim()) &&
    oProd.ProductName.ToUpper().Contains(ProductName.ToUpper().Trim()) 
|| (!String.IsNullOrEmpty((size??"").Trim()) && oProd.Size.ToString().ToUpper().Contains(size.ToUpper().Trim())));

答案 5 :(得分:-1)

if(!String.IsNullOrWhiteSpace(oProd.SectionName)){
    oProdList = oProdList.Where(oProd => oProd.SectionName.ToUpper().Contains(ProductName.ToUpper().Trim());
}

if(!String.IsNullOrWhiteSpace(oProd.Size)){
    oProdList = oProdList.Where(oProd => oProd.Size.ToUpper().Contains(size.ToUpper().Trim());
}