Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在LINQ命令中避免空值?_C#_Linq_Entity Framework 4_Linq To Entities - Fatal编程技术网

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

C# 如何在LINQ命令中避免空值?,c#,linq,entity-framework-4,linq-to-entities,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> Pro

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

我有以下对象的结构

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;           
}
现在请检查下面的图片,我有产品列表,我正试图通过在文本框中键入来查找产品1,并且我将大小文本框保留为空。 现在,当我单击submit时,我传递这两个变量以在Index方法中进行搜索(在一个上面),但LINQ命令同时返回记录Product1和Product2 但它应该只返回一条记录

如何应对


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

试试这个

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();

        }

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

试试这个:

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;

您可以在这里使用null合并运算符

    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())));

这是因为每个字符串值都包含空字符串 并且您的参数大小默认值设置为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”将与
大小的“25”匹配,因为我们正在执行
包含的
。如果只想在输入“25”而不是“2”时匹配,请将其设置为
=
,而不是
包含
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();
}
公共类产品
{
公共int Id{get;set;}
公共字符串ProductName{get;set;}
公共双大小{get;set;}
}
私有列表AddProducts()
{
List ProductList=新列表();
var p=新产品();
p、 Id=1;
p、 ProductName=“Product1”;
p、 尺寸=25;
产品列表。添加(p);
var p2=新产品();
p2.Id=2;
p2.ProductName=“产品2”;
p2.尺寸=25;
ProductList.Add(p2);
返回产品列表;
}
公共操作结果索引(string productname=“”,string size=“”)
{
var oProdList=从AddProducts()中的p选择p;
如果(!string.IsNullOrWhiteSpace(productname)&&!string.IsNullOrWhiteSpace(size))
{
oProdList=oProdList.Where(p=>p.ProductName.ToUpper().Trim().Contains(ProductName.ToUpper().Trim())和&p.Size.ToString().Contains(Size.Trim());
}
其他的
{
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()包含(size.Trim()):p.size.ToString()==size.Trim();
}
ViewBag.ProductList=oProdList;
返回视图();
}

如果两个命令返回不同的结果集,它将覆盖oProdList?我不想覆盖它。。。我想用一个以上的参数做一个搜索,若任何参数为空,那个么它将返回所有记录…两天以来我一直在试图弄清楚,为什么这么难?为什么否决投票!!!这里我要做的是构建查询,它不会获取数据,直到您调用类似
ToList()
等的调用。我认为问题在于空值。。。。如果我将size参数设置为空,那么它将返回两个记录……您应该比较相同的类型,我建议您将size设置为空(double?),以便您可以检查空白大小并编辑版本。我将Trim()添加到参数中。当您发布这些值时,这些值可能不是空的。问题是空值…它在命令中返回true,因此其返回调用值…仅在我仅放置Productname时有效,而在我将这些值放置在两个文本框中时无效。。。用户可以同时输入两个字段或任意字段…我们不能假设用户每次都可以输入productName…我正在使用它进行搜索,用户只能输入productName,也可以同时输入productName和Size。。。。这两个时间应该工作…所以我使用或不,它的工作只为产品名称,如果我提到产品名称和大小都,但它仍然在产品名称的基础上…它不考虑大小。
    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()))
        );
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();
}