我正在开发MVC中的应用程序。 我正在使用实体框架。
我想使用LINQ命令从对象列表中搜索对象。
我有以下对象的结构
public class Inventory
{
public int Id { get; set; }
public string SectionName { get; set; }
public string SectionCode { get; set; }
public double Size { get; set; }
}
以下方法添加列表中的对象
private List<Inventory> AddProducts()
{
List<Inventory> ProductList = new List<Inventory>();
Inventory oInventory = new Inventory();
oInventory.Id = 1;
oInventory.SectionName = "Section1";
oInventory.Size = 23;
oInventory.SectionCode = "148587";
ProductList.Add(oInventory);
oInventory = new Inventory();
oInventory.Id = 2;
oInventory.SectionName = "Section2";
oInventory.Size = 23;
oInventory.SectionCode = "142694";
ProductList.Add(oInventory);
oInventory = new Inventory();
oInventory.Id = 3;
oInventory.SectionName = "Section3";
oInventory.Size = 23;
oInventory.SectionCode = "202587";
ProductList.Add(oInventory);
return ProductList;
}
我在列表中只提到了3个项目,在实际应用中列表中有很多对象。
我有以下代码......
public ActionResult Index(string sectionName = "", string sectionCode = "", string size = "")
{
var inventoryProducts = from inventoryProd in AddProducts() select inventoryProd;
sectionName = "Section1";
sectionCode = "";
size = "";
inventoryProducts = inventoryProducts.Where(emp => emp.SectionName.ToUpper().Contains(sectionName.ToUpper().Trim())
|| emp.SectionCode.ToUpper().Contains(sectionCode.ToUpper().Trim())
|| emp.Size.ToString().ToUpper().Contains(size.ToUpper().Trim()));
ViewBag.ProductList = inventoryProducts;
return View();
}
现在我的问题是,当上面的命令执行时,它返回所有三个记录,我期待只有一个记录具有“Section1”内容...... 有什么问题?
答案 0 :(得分:0)
您正在SectionCode
和Size
上搜索空字符串。因为您正在使用OR语句,所以您的查询将匹配每个对象。当您搜索空字符串时,String.Contains
将始终返回true
。见http://msdn.microsoft.com/en-us/library/dy85x1sa%28v=vs.110%29.aspx
根据您的要求,您可以通过将ORS更改为ANDS来确保所有字段与过滤器匹配。这将导致每个对象都需要让每个字段都匹配您的过滤器。
inventoryProducts = inventoryProducts.Where(emp => emp.SectionName.ToUpper().Contains(sectionName.ToUpper().Trim())
&& emp.SectionCode.ToUpper().Contains(sectionCode.ToUpper().Trim())
&& emp.Size.ToString().ToUpper().Contains(size.ToUpper().Trim()));
或者,如果您只想对已填充的字段进行过滤,在这种情况下,您只应过滤使用String.IsNullOrWhiteSpace填充的字段。这将导致每个对象只需要一个字段来匹配过滤器
if (!String.IsNullOrWhiteSpace(sectionName.ToUpper().Trim()))
inventoryProducts = inventoryProducts.Where(emp => emp.SectionName.ToUpper().Contains(sectionName.ToUpper().Trim());
if (!String.IsNullOrWhiteSpace(sectionCode.ToUpper().Trim()))
inventoryProducts = inventoryProducts.Where(emp => emp.SectionCode.ToUpper().Contains(sectionCode.ToUpper().Trim());
if (!String.IsNullOrWhiteSpace(size.ToUpper().Trim()))
inventoryProducts = inventoryProducts.Where(emp => emp.Size.ToString().ToUpper().Contains(size.ToUpper().Trim()));
答案 1 :(得分:-1)
我将搜索代码更改为 -
[HttpPost]
public ActionResult Index(FormCollection oFormCollection, int? page)
{
var pageNumber = page ?? 1;
var pagesize = 5;
var inventoryProducts = from inventoryProd in AddProducts() select inventoryProd;
string sectionName = oFormCollection["sectionName"];
string sectionCode = oFormCollection["sectionCode"];
string size = oFormCollection["size"].ToString();
var searchedResult = (from e in inventoryProducts
where e.SectionName == sectionName.ToUpper().Trim()
|| e.SectionCode == sectionCode.ToUpper().Trim()
|| e.Size.ToString() == size.Trim()
select e).ToList();
ViewBag.SectionName = sectionName;
ViewBag.SectionCode = sectionCode;
ViewBag.Size = size;
ViewBag.ProductList = searchedResult.ToPagedList(pageNumber, pagesize);
return View();
}
它给了我适当的值。