using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Data.Linq;
using System.Linq;
using System.Web;
namespace DevExpress.Web.Demos.Mvc {
public static class NorthwindDataProvider { //数据供应
const string NorthwindDataContextKey = "DXNorthwindDataContext"; //数据库contextKey
public static NorthwindContext DB { //实例化context方法
get {
if(HttpContext.Current.Items[NorthwindDataContextKey] == null)
HttpContext.Current.Items[NorthwindDataContextKey] = new NorthwindContext();
return (NorthwindContext)HttpContext.Current.Items[NorthwindDataContextKey];
}
}
//思路:定义一个DB的使用方法,定义一个类来配合,在测试
//item--获得一个键/值集合,可用于在system.web之间组织和共享数据。IHttpModule接口和system.web。HTTP请求期间的IHttpHandler接口。
//https://www.cnblogs.com/fish-li/archive/2013/04/06/3002940.html
static double CalculateAveragePrice(int categoryID)
{ //计算平均价格,返回double
return (double)(from product in DB.Products where product.CategoryID == categoryID
select product).Average(s => s.UnitPrice); //根据分类ID查询数据,并取单价的平均值
}static double CalculateMinPrice(int categoryID) { //计算最低价格
return (double)(from product in DB.Products where product.CategoryID == categoryID
select product).Min(s => s.UnitPrice);
}static double CalculateMaxPrice(int categoryID) { //计算最高价格
return (double)(from product in DB.Products where product.CategoryID == categoryID
select product).Max(s => s.UnitPrice);
}public static IEnumerable GetCategories() { //获得分类
var query = from category in DB.Categories
select new { //生成一个匿名可枚举数据集
CategoryID = category.CategoryID,
CategoryName = category.CategoryName,
Description = category.Description,
Picture = category.Picture
};
return query.ToList(); //转换为集合返回给前台
}
public static Category GetCategoryByID(int categoryID) { //根据ID查询出一条分类信息
return (from category in DB.Categories where category.CategoryID == categoryID select category).SingleOrDefault<Category>();
}
public static string GetCategoryNameById(int id) {
Category category = GetCategoryByID(id);
return category != null ? category.CategoryName : null; //根据ID查询分类名称,三元表达式判断空值
}
public static IEnumerable GetCategoriesNames() {
return from category in DB.Categories select category.CategoryName; //查询所有的分类名称
}
public static IEnumerable GetCategoriesAverage() {
var query = DB.Categories.ToList().Select(category => new { //查询分类的平均价格,组成两个字段的列表返回
category.CategoryName,
AvgPrice = CalculateAveragePrice(category.CategoryID) //这里调用了前面刚定义的方法,学习了
});
return query.ToList();
}
public static IEnumerable GetCategoriesMin() { //最小值 同上
var query = DB.Categories.ToList().Select(category => new {
category.CategoryName,
AvgPrice = CalculateMinPrice(category.CategoryID)
});
return query.ToList();
}
public static IEnumerable GetCategoriesMax() { //最大值 同上
var query = DB.Categories.ToList().Select(category => new {
category.CategoryName,
AvgPrice = CalculateMaxPrice(category.CategoryID)
});
return query.ToList();
}
public static IEnumerable GetSuppliers() { //获取供应商列表
return DB.Suppliers.ToList();
}
public static IEnumerable GetCustomers() { //获取客户所有数据
return DB.Customers.ToList();
}
public static Customer GetCustomerByID(string customerID) { //根据id获取Customer数据的第一行
return (from customer in DB.Customers
where customer.CustomerID == customerID
select new Customer { //注意新的数据放在这个类里面
CompanyName = customer.CompanyName,
ContactName = customer.ContactName,
ContactTitle = customer.ContactTitle,
Address = customer.Address,
City = customer.City,
Country = customer.Country,
Fax = customer.Fax,
Phone = customer.Phone,
}).SingleOrDefault(); //选择唯一值
}
public static string GetFirstCustomerID() { //获取第一个客户ID
return (from customer in NorthwindDataProvider.DB.Customers
select customer.CustomerID).First<string>(); //此处的id是string的
}
public static IEnumerable GetProducts() { //获取产品列表
return DB.Products.ToList();
}
public static IEnumerable GetProducts(string categoryName) { //根据分类名称获取产品列表
var query = from product in DB.Products
join category in DB.Categories on product.CategoryID equals category.CategoryID //合并两张表
where category.CategoryName == categoryName //合并表中的种类名等于参数
select product; //选择产品
return query.ToList();
}
public static IEnumerable GetProducts(int? categoryID) { //根据种类id获取产品列表
return DB.Products.Where(p => p.CategoryID == categoryID).ToList();
}
public static IEnumerable GetEmployees() { //获取员工总表
return DB.Employees.ToList();
}
public static IEnumerable GetEmployeesOrders() { //获取订单列表
var query = from orders in DB.Orders
join employee in DB.Employees on orders.EmployeeID equals employee.EmployeeID //合并表
select new EmployeeOrder {
OrderDate = orders.OrderDate,
Freight = orders.Freight,
LastName = employee.LastName,
FirstName = employee.FirstName,
Photo = employee.Photo,
Id = employee.EmployeeID
};
return query.ToList();
}
public static Binary GetEmployeePhoto(string lastName) { //根据名查询图像,返回二进制图像给前台
return (from employee in DB.Employees
where employee.LastName == lastName
select employee.Photo).SingleOrDefault(); //唯一值
}
public static Binary GetEmployeePhoto(int employeeId) { //根据员工id获取二进制图像
return (from employee in DB.Employees
where employee.EmployeeID == employeeId
select employee.Photo).SingleOrDefault();
}
public static string GetEmployeeNotes(int employeeId) { //根据员工Id获取注释
return (from employee in DB.Employees
where employee.EmployeeID == employeeId
select employee.Notes).Single();
}
public static IList<EditableEmployee> GetEditableEmployees() {
const string SessionKey = "DXDemoEmployees";
IList<EditableEmployee> employeesList = HttpContext.Current.Session[SessionKey] as IList<EditableEmployee>;
//从session读取可编辑的员工列表,这行代码最主要的功能是减少查询数据库的次数
if(employeesList == null) { //如果里面没有内容则赋值HttpContext.Current.Session[SessionKey] = employeesList = (from employee in DB.Employees select new EditableEmployee {
EmployeeID= employee.EmployeeID,
FirstName =employee.FirstName,
LastName =employee.LastName,
Title =employee.Title,
HomePhone =employee.HomePhone,
BirthDate =employee.BirthDate,
HireDate =employee.HireDate,
Notes =employee.Notes,
ReportsTo =employee.ReportsTo,
Photo =employee.Photo
}).ToList();
}
return employeesList; //保证了里面有值
}
public static EditableEmployee GetEditableEmployeeByID(int employeeID) {
return GetEditableEmployees().Where(e => e.EmployeeID == employeeID).SingleOrDefault();
//调用方法,然后根据员工ID筛选出一条记录,使用Session避免多次查询
public static int GetNewEditableEmployeeID() { //获取新的可编辑员工表的最后一个id
IEnumerable<EditableEmployee> editableEmployees = GetEditableEmployees(); //获取表
return (editableEmployees.Count() > 0) ? editableEmployees.Last().EmployeeID + 1 : 0;
//如果这个集合里面有数据,查询出最后一条数据并取id+1就是新的id,否则返回0
public static void UpdateEditableEmployee(EditableEmployee employee) {
//更新自定类的列表,参数是前台传过来的赋值后的自定义类
var editableEmployee = GetEditableEmployees().Where(e => e.EmployeeID == employee.EmployeeID).SingleOrDefault();
//查询出员工表根据id筛选出一条记录
if(editableEmployee == null)
//如果为空,直接返回,否则把参数中传过来的值赋给定义的变量editableEmployee,此处有疑问,没有看到写入数据库的方法
return;editableEmployee.FirstName = employee.FirstName;
editableEmployee.LastName = employee.LastName;
editableEmployee.Title = employee.Title;
editableEmployee.BirthDate = employee.BirthDate;
editableEmployee.HireDate = employee.HireDate;
editableEmployee.Notes = employee.Notes;
editableEmployee.ReportsTo = employee.ReportsTo;
editableEmployee.HomePhone = employee.HomePhone;
editableEmployee.Photo = employee.Photo;
}
EditableEmployee editEmployee = new EditableEmployee();
editEmployee.EmployeeID = GetNewEditableEmployeeID();
editEmployee.FirstName = employee.FirstName;
editEmployee.LastName = employee.LastName;
editEmployee.BirthDate = employee.BirthDate;
editEmployee.HireDate = employee.HireDate;
editEmployee.Title = employee.Title;
editEmployee.Notes = employee.Notes;
editEmployee.ReportsTo = employee.ReportsTo;
editEmployee.Photo = employee.Photo;
GetEditableEmployees().Add(editEmployee); //此处应该是定义了插入的方法
}
const string SessionKey = "DXDemoCustomers";
IList<EditableCustomer> customersList = HttpContext.Current.Session[SessionKey] as IList<EditableCustomer>;
if(customersList == null) {
HttpContext.Current.Session[SessionKey] = customersList = (from customer in DB.Customers
select new EditableCustomer {
CustomerID= customer.CustomerID,
CompanyName= customer.CompanyName,
ContactName= customer.ContactName,
City =customer.City,
Region =customer.Region,
Country =customer.Country }
).ToList();
}
return customersList;
}
return GetEditableCustomers().Where(c => c.CustomerID.Equals(customerID)).SingleOrDefault();
}
public static void UpdateCustomer(EditableCustomer customer) { //同员工表
EditableCustomer editableCustomer = GetEditableCustomerByID(customer.CustomerID);
if(editableCustomer == null)
return;
editableCustomer.CompanyName = customer.CompanyName;
editableCustomer.ContactName = customer.ContactName;
editableCustomer.City = customer.City;
editableCustomer.Country = customer.Country;
editableCustomer.Region = customer.Region;
}
return DB.Orders.ToList();
}
public static IEnumerable GetInvoices() { //获取发票信息
var query = from invoice in DB.Invoices
//invoices是放在视图里面的,在视图中多表连接查询得到一个结果集
join customer in DB.Customers on invoice.CustomerID equals customer.CustomerID
//连接顾客表与发票信息
select new Mvc.Invoice() { //赋值给自定义类CompanyName = customer.CompanyName, //公司名
City = invoice.City, //城市
Region = invoice.Region, //地区
Country = invoice.Country, //国家
UnitPrice = invoice.UnitPrice, //单价
Quantity = invoice.Quantity, //总价
Discount = invoice.Discount //折扣
};
return query.ToList();
}
public static IEnumerable GetFullInvoices() { //获取完整的发票信息
var query = from invoice in DB.Invoices
join customer in DB.Customers on invoice.CustomerID equals customer.CustomerID
join order in DB.Orders on invoice.OrderID equals order.OrderID
//连接三张表
SalesPerson = order.Employee.FirstName + " " + order.Employee.LastName, //销售员
customer.CompanyName, //公司名
invoice.Address,
invoice.City,
invoice.Country,
invoice.CustomerName,
invoice.Discount,
invoice.ExtendedPrice, //总价
invoice.Freight, //货运
invoice.OrderDate, //定单日期
invoice.ProductName, //产品名称
invoice.Quantity, //定单数量
invoice.Region,
invoice.UnitPrice,
};
return query.ToList();
}
public static IEnumerable GetInvoices(string customerID) { //根据顾客id获取发票
return DB.Invoices.Where(i => i.CustomerID == customerID).ToList();
}
public static IList<EditableProduct> GetEditableProducts() { //允许编辑产品,这里是查出数据给前台
IList<EditableProduct> products = (IList<EditableProduct>)HttpContext.Current.Session["Products"];
//如果Session有值就减少查询,没有就查询后赋值
if(products == null) {products = (from product in DB.Products
select new EditableProduct {
ProductID = product.ProductID,
ProductName = product.ProductName,
CategoryID = product.CategoryID,
SupplierID = product.SupplierID,
QuantityPerUnit = product.QuantityPerUnit,
UnitPrice = product.UnitPrice,
UnitsInStock = product.UnitsInStock,
Discontinued = product.Discontinued
}).ToList();
HttpContext.Current.Session["Products"] = products;
}
return products;
}
public static EditableProduct GetEditableProduct(int productID) {
return (from product in GetEditableProducts() where product.ProductID == productID select product).FirstOrDefault();}
//根据id查出一条数据
IEnumerable<EditableProduct> editableProducts = GetEditableProducts();
return (editableProducts.Count() > 0) ? editableProducts.Last().ProductID + 1 : 0;
}
public static void DeleteProduct(int productID) { //根据产品id删除产品信息
EditableProduct product = GetEditableProduct(productID);
if(product != null)
GetEditableProducts().Remove(product); //这个地方要根据访问数据库的方式更改
}
public static void InsertProduct(EditableProduct product) {
EditableProduct editProduct = new EditableProduct();
editProduct.ProductID = GetNewEditableProductID();
editProduct.ProductName = product.ProductName;
editProduct.CategoryID = product.CategoryID;
editProduct.SupplierID = product.SupplierID;
editProduct.QuantityPerUnit = product.QuantityPerUnit;
editProduct.UnitPrice = product.UnitPrice;
editProduct.UnitsInStock = product.UnitsInStock;
editProduct.Discontinued = product.Discontinued;
GetEditableProducts().Add(editProduct); //与员工表的处理方式相同
}
public static void UpdateProduct(EditableProduct product) {
EditableProduct editProduct = GetEditableProduct(product.ProductID);
if(editProduct != null) {
editProduct.ProductName = product.ProductName;
editProduct.CategoryID = product.CategoryID;
editProduct.SupplierID = product.SupplierID;
editProduct.QuantityPerUnit = product.QuantityPerUnit;
editProduct.UnitPrice = product.UnitPrice;
editProduct.UnitsInStock = product.UnitsInStock;
editProduct.Discontinued = product.Discontinued;
} //与员工表的处理方式相同
}
public static IEnumerable GetEmployeesList() { //获取员工的姓名称id号,应该是给下拉框准备的
return DB.Employees.ToList().Select(e => new {
ID = e.EmployeeID,
Name = e.LastName + " " + e.FirstName
});
}
public static int GetFirstEmployeeID() {
//获取员工表的第一条id,不明白要做什么,这个值虽然是一个数字,但记录本身是无序的,如果没有排序,有可能会有错误
return DB.Employees.First().EmployeeID;}
public static Employee GetEmployee(int employeeId) { //根据ID选择一条记录
return DB.Employees.Single(e => employeeId == e.EmployeeID); //
}
public static IEnumerable GetOrders(int employeeID) {
//连接三张表生成一个匿名类转为list给前台,这种方式只能用来展示数据
var query = from order in DB.Orderswhere order.EmployeeID == employeeID
join order_detail in DB.Order_Details on order.OrderID equals order_detail.OrderID
join customer in DB.Customers on order.CustomerID equals customer.CustomerID
select new {
order.OrderID,
order.OrderDate,
order.ShipName,
order.ShipCountry,
order.ShipCity,
order.ShipAddress,
order.ShippedDate,
order_detail.Quantity,
order_detail.UnitPrice,
customer.CustomerID,
customer.ContactName,
customer.CompanyName,
customer.City,
customer.Address,
customer.Phone,
customer.Fax
};
return query.ToList();
}
public static IEnumerable GetProductReports() { //销售大类合计表连接发票表,生成一张带有发货时间的表
var query = from sale in DB.Sales_by_Categories
join invoice in DB.Invoices on sale.ProductName equals invoice.ProductName
where invoice.ShippedDate != null
select new {
sale.CategoryName,
sale.ProductName,
sale.ProductSales,
invoice.ShippedDate, //发货时间
};
return query.ToList();
}
public static IEnumerable GetCustomerReports() {
var query = from customer in DB.Customers //顾客表
join order in DB.Orders on customer.CustomerID equals order.CustomerID //订单表
join order_detail in DB.Order_Details on order.OrderID equals order_detail.OrderID //订单详情表
join product in DB.Products on order_detail.ProductID equals product.ProductID //产品表
select new { //匿名类转列表给前台展示
product.ProductName, //产品名称
customer.CompanyName, //公司名称
order.OrderDate, //订单日期
ProductAmount = (float)(order_detail.UnitPrice * order_detail.Quantity) * (1 - order_detail.Discount / 100) *100
}; //总金额
return query.ToList();
}
return DB.SalesPersons.ToList();
}
}
public class EditableProduct { //产品类
public int ProductID { get; set; }
[Required(ErrorMessage = "Product Name is required")] //标记 必需的
[StringLength(50, ErrorMessage = "Must be under 50 characters")] //字符串的长度50以内
public string ProductName { get; set; }
[Required(ErrorMessage = "Category is required")]
public int? CategoryID { get; set; }
public int? SupplierID { get; set; }
[StringLength(100, ErrorMessage = "Must be under 100 characters")]
public string QuantityPerUnit { get; set; }
[Range(0, 10000, ErrorMessage = "Must be between 0 and 10000$")] //范围限制
public decimal? UnitPrice { get; set; }
[Range(0, 1000, ErrorMessage = "Must be between 0 and 1000")]
public short? UnitsInStock { get; set; }
bool? discontinued; //可空类型
public bool? Discontinued { //显示的名字
get {
return discontinued;
}
set {
discontinued = value == null ? false : value; //注意用法:三元表达式
}
}
}
public class Invoice {
public string CompanyName { get; set; }
public string City { get; set; }
public string Region { get; set; }
public string Country { get; set; }
public decimal UnitPrice { get; set; }
public short Quantity { get; set; }
public float Discount { get; set; }
}
public class EditableEmployee {
public int EmployeeID { get; set; }
[Required(ErrorMessage = "First Name is required")]
[StringLength(10, ErrorMessage = "Must be under 10 characters")]
[Display(Name = "First Name")] //前台显示的名称
public string FirstName { get; set; }
[Required(ErrorMessage = "Last Name is required")]
[StringLength(20, ErrorMessage = "Must be under 20 characters")]
[Display(Name = "Last Name")]
public string LastName { get; set; }
[StringLength(30, ErrorMessage = "Must be under 30 characters")]
[Display(Name = "Position")]
public string Title { get; set; }
[StringLength(24, ErrorMessage = "Must be under 24 characters")]
[Display(Name = "Home Phone")]
public string HomePhone { get; set; }
[Display(Name = "Birth Date")]
public DateTime? BirthDate { get; set; }
[Display(Name = "Hire Date")]
public DateTime? HireDate { get; set; }
public string Notes { get; set; }
public int? ReportsTo { get; set; }
public byte[] Photo { get; set; }
}
public class EditableCustomer {
public string CustomerID { get; set; }
[Required(ErrorMessage = "Company Name is required")]
[StringLength(40, ErrorMessage = "Must be under 40 characters")]
public string CompanyName { get; set; }
[StringLength(30, ErrorMessage = "Must be under 30 characters")]
public string ContactName { get; set; }
[StringLength(15, ErrorMessage = "Must be under 15 characters")]
public string City { get; set; }
[StringLength(15, ErrorMessage = "Must be under 15 characters")]
public string Region { get; set; }
[StringLength(15, ErrorMessage = "Must be under 15 characters")]
public string Country { get; set; }
}
public class EmployeeOrder {
public DateTime? OrderDate { get; set; }
public decimal? Freight { get; set; }
public decimal? Id { get; set; } //可空的小数类型
public string LastName { get; set; }
public string FirstName { get; set; }
public byte[] Photo { get; set; }
}
}