我遇到的问题是这样的:
我的视图中有一个文本框,该文本框允许使用Orders表的搜索/过滤器功能。但是,我希望它也能够通过子表OrderDetails搜索并进行适当过滤。
搜索文本框适用于订单表,但不适用于订单明细。
我意识到这段代码可以缩减很多,但是我是新的代码。
可能有帮助的事情-我先做数据库
到目前为止,这是我的代码。
控制器:
EntitiesDB db = new EntitiesDB();
#region INDEX MAIN PAGE
[HttpGet]
public ActionResult Index(string sortOrder, string currentFilter, int? page, string jobNumberDropDown, string requesitionerDropDown, string supplierDropDown, string dateRequestedDropDown, string dateRequiredDropDown, string searchString)
{
var getSupplierList = db.Suppliers.OrderBy(SL => SL.SupplierName).ToList();
var getEmployeeList = db.Employees.OrderBy(EL => EL.FullName).ToList();
SelectList listOfSuppliers = new SelectList(getSupplierList, "SupplierName", "SupplierName");
SelectList listOfEmployees = new SelectList(getEmployeeList, "FullName", "FullName");
ViewBag.supplierNames = listOfSuppliers;
ViewBag.employeeNames = listOfEmployees;
#region PAGINATION FUNCTION
//Code for Paging
ViewBag.CurrentSort = sortOrder;
if (searchString != null)
{
page = 1;
}
else
{
searchString = currentFilter;
}
ViewBag.CurrentFilter = currentFilter;
int pageSize = 10;
int pageNumber = (page ?? 1);
#endregion
#region SEARCH FUNCTION
//Creates the LINQ Query to select the Orders from the ORDERS table
//var orders = from o in db.Orders join c in db.OrderDetails on o.OrderID equals c.OrderID select new { orders = o.JobNumber, o.PurchaseOrder, c.Description, c.PartNumber, c.AngstromPartNumber };
var orders = from o in db.Orders.Where(x => x.IsDeleted != true) select o; /*-****WORKING FOR ORDER TABLE*****/
var orderDetails = from od in db.OrderDetails.Where(x => x.IsDeleted != true) select od;
//List of Employees
var requesitionerList = new List<string>();
//List of Suppliers
var supplierList = new List<string>();
//List of Job Numbers
var jobNumberList = new List<string>();
//List of Dates Requested
var dateRequestedList = new List<DateTime>();
//List of Dates Required
var dateRequiredList = new List<DateTime>();
//Query the ORDERS table columns
var requesitionerQry = from r in db.Orders.Where(x => x.IsDeleted != true) orderby r.Requesitioner select r.Requesitioner;
var supplierQry = from s in db.Orders.Where(x => x.IsDeleted != true) orderby s.Supplier select s.Supplier;
var jobNumberQry = from j in db.Orders.Where(x => x.IsDeleted != true) orderby j.JobNumber select j.JobNumber;
var dateRequestedQry = from DRqst in db.Orders.Where(x => x.IsDeleted != true) orderby DRqst.DateRequested select DRqst.DateRequested;
var dateRequiredQry = from DRqrd in db.Orders.Where(x => x.IsDeleted != true) orderby DRqrd.DateRequired select DRqrd.DateRequired;
//Searches through the columns filters out NULLS
var t = requesitionerQry.Distinct().ToList().Where(x => String.IsNullOrWhiteSpace(x) == false);
var u = supplierQry.Distinct().ToList().Where(y => String.IsNullOrWhiteSpace(y) == false);
var v = jobNumberQry.Distinct().ToList().Where(z => String.IsNullOrWhiteSpace(z) == false);
var dRT = dateRequestedQry.Distinct().ToList().Where(z1 => String.IsNullOrWhiteSpace(z1.ToString()) == false);
var dRD = dateRequiredQry.Distinct().ToList().Where(z2 => String.IsNullOrWhiteSpace(z2.ToString()) == false);
//Searches through the columns and only pulls out one of each unique string
requesitionerList.AddRange(t);
supplierList.AddRange(u);
jobNumberList.AddRange(v);
dateRequestedList.AddRange(dRT);
dateRequiredList.AddRange(dRD);
//I believe this Grabs the list items and arranges them into a viewable anonamous object
ViewBag.requesitionerDropDown = new SelectList(requesitionerList);
ViewBag.supplierDropDown = new SelectList(supplierList);
ViewBag.jobNumberDropDown = new SelectList(jobNumberList);
ViewBag.dateRequestedDropDown = new SelectList(dateRequestedList);
ViewBag.dateRequiredDropDown = new SelectList(dateRequiredList);
//This defines which columns the text in the search textbox should locate
if (!String.IsNullOrEmpty(searchString))
{
orders = orders.Where(a => a.JobNumber.Contains(searchString)||
//a.Description.Contains(searchString) || a.PartNumber.Contains(searchString) || a.AngstromPartNumber.Contains(searchString) ||
a.Supplier.Contains(searchString) || a.Reason.Contains(searchString) || a.Requesitioner.Contains(searchString) ||
a.DateRequested.ToString().Contains(searchString) || a.DateRequired.ToString().Contains(searchString) ||
a.ExpectedDate.ToString().Contains(searchString) || a.DateOrderPlaced.ToString().Contains(searchString) ||
a.PurchaseOrder.ToString().Contains(searchString));
}
if (!String.IsNullOrEmpty(searchString))
{
orders = orders.Where(x => x.OrderDetails.Any(i => i.Description.Contains(searchString)));
}
//Search the REQUESITIONER column
if (!String.IsNullOrEmpty(requesitionerDropDown))
{
orders = orders.Where(b => b.Requesitioner == requesitionerDropDown);
}
//Search the SUPPLIER column
if (!String.IsNullOrEmpty(supplierDropDown))
{
orders = orders.Where(c => c.Supplier == supplierDropDown);
}
//Search the JOBNUMBER column
if (!String.IsNullOrEmpty(jobNumberDropDown))
{
orders = orders.Where(d => d.JobNumber == jobNumberDropDown);
}
if (!String.IsNullOrEmpty(dateRequestedDropDown))
{
orders = orders.Where(d => d.DateRequested.ToShortDateString() == dateRequestedDropDown);
}
if (!String.IsNullOrEmpty(dateRequiredDropDown))
{
orders = orders.Where(d => d.DateRequired.ToShortDateString() == dateRequiredDropDown);
}
#endregion
//List<Order> OrderList = db.Orders.ToList();
var sortedOrders = orders.OrderBy(x => x.JobNumber);
return View(sortedOrders.ToPagedList(pageNumber, pageSize));
}
#endregion
这是我的模特:
public partial class Order
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Order()
{
this.OrderDetails = new HashSet<OrderDetail>();
}
public System.Guid OrderID { get; set; }
public Nullable<bool> IsDeleted { get; set; }
public string JobNumber { get; set; }
public string Supplier { get; set; }
public string Reason { get; set; }
public string Requesitioner { get; set; }
public System.DateTime DateRequested { get; set; }
public System.DateTime DateRequired { get; set; }
public Nullable<bool> Urgent { get; set; }
public System.DateTime ExpectedDate { get; set; }
public System.DateTime DateOrderPlaced { get; set; }
public string PurchaseOrder { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<OrderDetail> OrderDetails { get; set; }
}
public partial class OrderDetail
{
public System.Guid OrderDetailID { get; set; }
public Nullable<bool> IsDeleted { get; set; }
public int Quantity { get; set; }
public string Description { get; set; }
public string PartNumber { get; set; }
public string Notes { get; set; }
public string Comments { get; set; }
public Nullable<decimal> UnitPrice { get; set; }
public string AngstromPartNumber { get; set; }
public string Manufacturer { get; set; }
public Nullable<int> BoneYard { get; set; }
public System.Guid OrderID { get; set; }
public Nullable<System.Guid> EmployeeID { get; set; }
public Nullable<System.Guid> SupplierID { get; set; }
public virtual Employee Employee { get; set; }
public virtual Order Order { get; set; }
public virtual Supplier Supplier { get; set; }
}