泛型:泛型优点:
1,编译时可以保证类型安全。
2,不用做类型转换,获得一定的性能提升。
泛型约束:
where T:struct :参数类型是值类型
where T:class :参数类型是引用类型
where T:new() :参数类型是要有一个public的无参构造函数
where T::参数类型是派生某个基类where T: :参数类型要实现某个接口
where T:U :这里T和U都是类型参数,T必须是或者派生自U
部分类 partial
public partial class Form1 : Form
匿名函数类的属性是只读的
//声明扩展方法
//扩展方法必须是静态的,Add有三个参数
//this 必须有,string表示我要扩展的类型,stringName表示对象名
//三个参数this和扩展的类型必不可少,对象名可以自己随意取如果需要传递参数,//再增加一个变量即可
public static string Add(this string stringName)
IQueryable 延迟加载机制
ref:传递对实参的引用,而不是实参的拷贝(实参拷贝static void doIncrement( int param)
static void doIncrement(ref int param){
params++;
}
static void Main(){
int arg=42;
doIncrement(ref arg);
cw.w(arg);//output result is 43
}
out:必须在方法内部赋值
EF分页temp = temp.OrderBy(orderbyLambda).Skip((pageIndex - 1) * pageSize).Take(pageSize);
Sqo:
List list=new List(User){new User{Id=1,name="zuoguo",Age=21},new User{Id=2,name="zuoguo3",Age=23}}
list.where(x=>x.Age>=30).select(s=>s.name).toList();
where延迟加载,查询时返回是DbQuery对象,当使用他时才生成sql语句查询
list.FindAll(x=>x.Age>=30) //立即加载
LinqIEnumerable listDogs=from dog in dogs
新特效可选参数:
注意:1,不能为参数列表的第一个参数,位于必选之后
2,必须指定一个默认值而且是常量
public void Say(string name="wanwan",int age=1)
线程:
①默认情况,一个进程只包含一个线程,从程序的开始到执行结束;
②线程可以派生自其它线程,所以一个进程可以包含不同状态的多个线程,来执行程序的不同部分;
③一个进程中的多个线程,将共享该进程的资源;
④系统为处理器执行所规划的单元是线程,而非进程。
EF:ORM框架,基于ADO.net开发的,用了反射和特性。最终由ADO。net负责从数据库中读取数据,返回EF
特点:支持多中数据库,提高开发效率
强劲的映射引擎,很好的支持存储过程
集成于VS,可进行可视化操作
能够与asp。net,wpf wcf 等j进行很好的集成。
EF中微软推荐先查询后修改
c=db.Customers.where(x=>x.Age>=30).select(s=>s.name).toList();
c.name="tommy"
db.saveChangs();
删除
Customers u=new Customers(){CustomersID="ZG"}
db.Customers.Attach(u);
db.Customers.remove(u);
db.saveChangs();
分页:
c=db.Customers.where(x=>x.Age>=30).orderBy(orderBy).Skip()(pageIndex-1)*pageSize).Take(pageSize);
IQueryable和IEnumberable区别:IEnumberable调用skip或者Take前数据已经加载,IQueryable
是延迟加载,IQueryable继承IEnumberable
创建线程中唯一EF对象:使用HttpContext对象,HttpContext就是微软封装的一个线程对象
1:
OAEntity db=null;
if(HttpContext.Items["db1"]=null)
{
db=new OAEntity();
HttpContext.Items["db1"]=db;
}
else{
db=HttpContext.Items["db1"] as OAEntity ;
}
2:
OAEntity db=CallContext.GetData("DB") as OAEntity;
if(db==null)
{
db=new OAEntity();
CallContext.SetData("DB",db);
}
MVC:-----
View:展示给用户,cshtml,ASPX,ASCX文件处理视图的责任
Model:实现业务逻辑对实体类相对应数据库操作。
3层:数据访问层,业务逻辑层,表示层。好处分工明细,有利于升级和维护,坏处带来一定的性能损失(子程序模块
未执行结束时,主线程模块只能处于等待)
MVC好处:便于单元测试,将代码与页面彻底分离
razor:
@:out of//如果不填写@:,系统会把out of当做C#语句
@using tommy.product //引用命名空间
@model tommy.student[] //引用类
@Html.Raw("
哇哈哈哈
")//输出是哇哈哈哈
@Html.renderPartial("login")//渲染部分视图,login是部分视图名字 @Html.renderPartial("Top",ViewData.Model)
@Html.renderPartial和@Html.Partial区别在于renderPartial效率高,Partial先缓存@Html.renderPartial和@Html.renderAction:renderPartial直接渲染而renderAction如果要读取数据库就要他public ActionResult Test(){ViewData["Msg"]="Hello world" return PartialView();}cshtml:@{Html.RenderAction("Test")}
cshtml被访问时也编译成页面类,继承WebViewPage,并编译到此类Execute方法中
在视图中请求某个action方法违反了MVC设计,renderAction会发起一个新request请求
/App_Data 存放私有数据,例如XML SQLSERVER等
/App_Start 存放核心配置设置
路由:它只为片段提取值,从上到下匹配,不会找最佳匹配值,只会找最先值
控制器:实现了IController接口,里面只有Execute方法,RequestContext封装了当前请求和匹配路由信息,控制器不会渲染视图
动作参数不允许out和ref,控制器动作返回的是ActionResult对象,然后交给ActionResult对象中的execute方法中,交给response输出
ViewResult:默认视图模板
PartialViewResult:默认分部视图模板
RedirectToRouteResult:重定向,根据路由生成Url
RedirectResult:重定向,特定Url
ContentResult:返回原始的文本数据
FileResult:将2进制数据传给浏览器
JsonResult:Josn格式
JavaScriptResult:
HttpNotFoundResult:返回404--未找到
HttpStatusCodeResult:返回指定的Http码
EmptyResult:什么不做
return view():返回当前请求视图 return View(“OtherIndex”)return View(“~/views/home”)指定视图
MVC流程:request--》routing解析--》controllerFactory---》controller--》actionInvoker--》ActionMethod--》response
1,处理未知动作: 如果动作调用器找不到要调用的动作和方法,便从它的InvokeAction方法返回false。这情况下,
controller会调用它的handleUnKnownAction方法(404--未找到) protected override void HandleUnknownAction(string actionName)
2,默认情况下,控制器支持会话状态,它会销毁一定内存和一些存储单元空间,使用无会话可以改善性能.
SessionState(SessionStateBehavior.Disabled)]只会对Class有效
SessionStateBehavior.default 默认
SessionStateBehavior.required 读写会话状态
readOnly 只读
Disabled 禁用
注意:ViewBag传递数据不会受SessionState影响
3,异步控制器public async Taskshow() { string date = await Task.Factory.StartNew(() => { return "sdsdf"; });
return View(date);
}
4,辅助方法#辅助器@helper ListArry(string s){foreach(string s in items){@s}}使用辅助器:@ListArry("xxx")##beginForm():创建表单回传源动作方法beginForm(action,controller):指定动作和方法beginForm(action,controller,method):beginForm(action,controller,method,attributes):attributes标签属性名称beginForm(action,controller,method,routeValues,attributes):
#输入辅助器:Html.CheckBox() ......
强类型辅助器:Html.CheckBoxFor(x=>x.isApproved) ......
强类型辅助器可以减少由于输错属性名称而引起的错误,通常会使用他
5,Ajax
Ajax.BeginForm("GetPeopleData".....)
Ajax.ActionLink
动作检测ajax请求:if(Request.IsAjaxRequest())
//是一个key value 和viewBag差不多,它会在请求结束后删除
TempData["message"] = string.Format("{0}has been saved",product.Name);
ViewBag不能跨请求,所有重定向使用他就没用了
TempData ViewData ViewBag的区别:
ViewData是字典类型,viewBag是dynamic(动态)型,会在程序运行时动态解析,viewData是object,需要
自己强转换类型,而ViewBag(只读get)是dynamic。viewBag其实是viewData,就说多了层dynamic
TempData用于一个请求中执行多个action方法之间共享数据,它的值在取得一次值后被删除
{viewbag.UserName="小李飞刀";ViewData["uername"]="aaa";TempData["username"]="bbbbb";
Preson p=new Preson{username="ccc"}}
@viewbag.UserName @ViewData["UserName"] @TempData["Username"] @Model.username
结果是:aaa,aaa,bbbbb,ccc 并非:小李飞刀,aaa,bbbbb,ccc viewBag和viewData本质一样被覆盖了
通过request获取url?后面的参数:Request.QueryString["jkt"];
常用模型特效标签
displayName,required,stringLenght(20,MinimumLenght=2),Range:验证字段范围,RegularExpression:自定义验证规则
if(ModelState.IsValid){}//判断是否模型验证
路由:
SEO(Search Engine Optimization):汉译为搜索引擎优化。
一个友好的SEO,URL不超过3层http://localhost/{分类}/{具体页}使用默认路由{controller}/{action}/{id}会影响网站SEO
性能优化:
1,// 缓存
[OutputCache(Duration =5,VaryByParam ="none")]
public ActionResult Index()
{
ViewBag.Now = DateTime.Now.ToString();
Response.Cache.SetOmitVaryStar(true);//解决隐藏Bug
2,捆绑技术:捆绑和缩小通过减少对服务器的请求数量并减少所请求资产的大小(如CSS和JavaScript)来缩短加载时间。目前大多数主流浏览器将每个主机名的同时连接数量限制为6个。
//默认true
public class BundleConfig {
//RegisterBundles 参数对象的 Add 方法添加,该方法的参数需要一个ScriptBundle 类 或 StyleBundle 类的实例对象。
//脚本文件用的是 ScriptBundle 类,样式文件用的是 StyleBundle 类,它们的构造参数代表着捆绑在一起的文件的引用。
//Include 方法用于包含具体要捆绑的文件。其中的 {version} 是文件版本的占位符,MVC会在相应的目录下定位到最新的一个版本文件。
public static void RegisterBundles(BundleCollection bundles) {
bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/*.css"));
bundles.Add(new ScriptBundle("~/bundles/clientfeaturesscripts").Include(
"~/Scripts/jquery-{version}.js",
"~/Scripts/jquery.validate.js",
"~/Scripts/jquery.validate.unobtrusive.js",
"~/Scripts/jquery.unobtrusive-ajax.js"));
}
}
方便之二:不用引入一大坨js、css文件,而是通过下列优雅的方式进行: @Scripts.Render("~/bundles/clientfeaturesscripts")
@RenderBody()
3,移除视图引擎private void RemoveWebFormEngines() { var viewEngines=ViewEngines.Engines;//获取引擎集合 var webFormViewEngines=viewEngines.OfType().FirstOrDefault();//拿到WebForm引擎
if (webFormViewEngines!=null)
{
viewEngines.Remove(webFormViewEngines);
}
}
protected void Application_Start()
{
RemoveWebFormEngines();//调用它
4, MvcHandler.DisableMvcResponseHeader = true;//隐藏MVC版本
测试框架:A/A/A 准备/动作/断言
//动作
var result = target.ValueProducts(products);
//断言
//Assert.AreEqual(goTotal, result);
Assert.AreEqual(products.Sum(e => e.Price), result);
SQL:
查:SELECT prod_id, prod_name, prod_price FROM Products;
SELECT distinct vend_id FROM Products; 它指示数据库只返回不同的值,它必须直接放在列名的前面,作用于所有的列
SELECT TOP 5 prod_name FROM Products; 返回5行数据
SELECT prod_name FROM Products ORDER BY prod_name;排序
SELECT prod_id, prod_price, prod_name FROM Products ORDER BY 2, 3; 先排序2列在排序3列
ORDER BY prod_price DESC;指定方向
SELECT prod_name, prod_price FROM Products WHERE prod_price = 3.49;过滤条件
WHERE prod_price BETWEEN 5 AND 10;检查范围
WHERE prod_price IS NULL;是否为空
WHERE vend_id = 'DLL01' AND prod_price <= 4;过滤多条件
WHERE vend_id = 'DLL01' OR vend_id = ‘BRS01’; WHERE子句可以包含任意数目的AND和OR操作符。
WHERE vend_id IN ( 'DLL01', 'BRS01' ) IN操作符一般比一组OR操作符执行得更快
WHERE NOT vend_id = 'DLL01' 否定其后条件的关键字
SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE 'Fish%';模糊查询Like
WHERE prod_name LIKE '%bean bag%';
WHERE prod_name LIKE '__ inch teddy bear';匹配单个字符
WHERE cust_contact LIKE '[JM]%' 通配符用来指定一个字符集 J M
汇总
AVG() SELECT AVG(prod_price) AS avg_price FROM Products;
返回某列的平均值
COUNT() SELECT COUNT(*) AS num_cust FROM Customers;
返回某列的行数
MAX() SELECT MAX(prod_price) AS max_price FROM Products;
返回某列的最大值
MIN() SELECT MIN(prod_price) AS min_price FROM Products;
返回某列的最小值
SUM() SELECT SUM(quantity) AS items_ordered FROM OrderItems WHERE order_num = 20005;
返回某列值之和
分组
SELECT vend_id, COUNT(*) AS num_prods FROM Products GROUP BY vend_id;
过滤分组
SELECT cust_id, COUNT(*) AS orders FROM Orders GROUP BY cust_id HAVING COUNT(*) >= 2;
子查询
SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01');
WHERE Vendors.vend_id = Products.vend_id;链表查询
外联
SELECT Customers.cust_id, Orders.order_num FROM Customers INNER JOIN Orders
ON Customers.cust_id = Orders.cust_id;
组合查询:
SELECT cust_name, cust_contact, cust_email FROM Customers
WHERE cust_state IN ('IL','IN','MI')
union
SELECT cust_name, cust_contact, cust_email FROM Customers
WHERE cust_name = 'Fun4All';
插入:
INSERT INTO Customers(cust_id, cust_name)VALUES('1000000006', 'Toy Land')
SELECT * INTO CustCopy FROM Customers; 复制表
更新
UPDATE Customers SET cust_email = 'kim@thetoystore.com' WHERE cust_id = '1000000005';
删除
DELETE FROM Customers WHERE cust_id = '1000000006';
CREATE TABLE Products (
);
prod_id vend_id prod_name prod_price prod_desc
CHAR(10) CHAR(10) CHAR(254) DECIMAL(8,2) VARCHAR(1000)
NOT NULL, NOT NULL, NOT NULL, NOT NULL, NULL