使用LINQ进行产品表过滤

时间:2017-04-15 16:46:50

标签: c# entity-framework linq

我在使用EF Code First后端的MVC应用程序中工作。我有一个产品表,我想按类别或品牌进行分页和过滤。

data table with filter

我不确定最好的方法是什么,并且随意指出我的方式的愚蠢,但是现在我在上面的页面中有以下ViewModel:

public class InventoryReportViewModel
{
  public SearchViewModel Search { get; set; } // 2 string props [Type and Term]
  public IEnumerable<ProductViewModel> Products { get; set; }
  public PaginationViewModel Pagination { get; set; } // 3 int props [currentPage, recordsPerPage, totalRecords]
}

我想知道如何构建我的LINQ查询并且不想重复自己,这是我的尝试:

public InventoryReportViewModel GetProducts(int page, string searchTerm, string searchType)
{
  var activeProducts = _context.Products.Where(p => !p.IsDeleted);
  if (!string.IsNullOrEmpty(searchTerm))
  {
    if (searchType == "category")
    {
      activeProducts.Where(
          p => string.Equals(p.Category.Name, searchTerm.Trim(), StringComparison.CurrentCultureIgnoreCase))
        .OrderBy(p => p.Category.Name)
        .Skip(_recordsPerPage * (page - 1))
        .Take(_recordsPerPage);
    }
    else
    {
      activeProducts.Where(
          p => string.Equals(p.Brand.Name, searchTerm.Trim(), StringComparison.CurrentCultureIgnoreCase))
        .Skip(_recordsPerPage * (page - 1))
        .Take(_recordsPerPage);
    }
  }
  else
  {
    activeProducts.Skip(_recordsPerPage * (page - 1)).Take(_recordsPerPage);
  }

  var productPageVm = new InventoryReportViewModel
  {
    Products = ProductViewModelFactory.BuildListOfProductViewModels(activeProducts),
    Pagination = new PaginationViewModel
    {
      CurrentPage = page,
      RecordsPerPage = _recordsPerPage,
      TotalRecords = _context.Products.Count(p => p.Quantity > 0 && !p.IsDeleted)
    }
  };
  return productPageVm;
}

但上述情况似乎无效!我在ViewModel中返回200个产品,因为那是我的recordsPerPage,因此我只能获得10个。

我哪里错了?

1 个答案:

答案 0 :(得分:1)

LINQ方法不会修改应用它们的序列,它们会生成新序列作为返回值。您需要使用LINQ操作的返回值! <{1}}不会受到方法调用的影响。

示例:

class MyAlgo<T> : where T has X and Y properties {}