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