如何使用linq从实体框架中的项目列表中搜索项目

时间:2014-03-07 13:24:21

标签: asp.net-mvc entity-framework entity-framework-5

我正在开发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”内容...... 有什么问题?

2 个答案:

答案 0 :(得分:0)

您正在SectionCodeSize上搜索空字符串。因为您正在使用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();
}

它给了我适当的值。