我正在尝试使用实体框架从列表中搜索对象。
我有以下对象的结构
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 但它应该只返回一个记录
如何处理?
答案 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)
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());
}