泛型:泛型優(yōu)點(diǎn):
1,編譯時(shí)可以保證類型安全。
2,不用做類型轉(zhuǎn)換,獲得一定的性能提升。
泛型約束:
where T:struct :參數(shù)類型是值類型
where T:class :參數(shù)類型是引用類型
where T:new() :參數(shù)類型是要有一個(gè)public的無參構(gòu)造函數(shù)
where T::參數(shù)類型是派生某個(gè)基類where T: :參數(shù)類型要實(shí)現(xiàn)某個(gè)接口
where T:U :這里T和U都是類型參數(shù),T必須是或者派生自U
部分類 partial
public partial class Form1 : Form
匿名函數(shù)類的屬性是只讀的
//聲明擴(kuò)展方法
//擴(kuò)展方法必須是靜態(tài)的,Add有三個(gè)參數(shù)
//this 必須有,string表示我要擴(kuò)展的類型,stringName表示對(duì)象名
//三個(gè)參數(shù)this和擴(kuò)展的類型必不可少,對(duì)象名可以自己隨意取如果需要傳遞參數(shù),//再增加一個(gè)變量即可
public static? string? Add(this string stringName)
IQueryable 延遲加載機(jī)制
ref:傳遞對(duì)實(shí)參的引用,而不是實(shí)參的拷貝(實(shí)參拷貝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:必須在方法內(nèi)部賦值
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延遲加載,查詢時(shí)返回是DbQuery對(duì)象,當(dāng)使用他時(shí)才生成sql語句查詢
list.FindAll(x=>x.Age>=30) //立即加載
LinqIEnumerable listDogs=from dog in dogs
新特效可選參數(shù):
注意:1,不能為參數(shù)列表的第一個(gè)參數(shù),位于必選之后
2,必須指定一個(gè)默認(rèn)值而且是常量
public void Say(string name="wanwan",int age=1)
線程:
? ? ①默認(rèn)情況,一個(gè)進(jìn)程只包含一個(gè)線程,從程序的開始到執(zhí)行結(jié)束;
? ? ②線程可以派生自其它線程,所以一個(gè)進(jìn)程可以包含不同狀態(tài)的多個(gè)線程,來執(zhí)行程序的不同部分;
? ? ③一個(gè)進(jìn)程中的多個(gè)線程,將共享該進(jìn)程的資源;
? ? ④系統(tǒng)為處理器執(zhí)行所規(guī)劃的單元是線程,而非進(jìn)程。
EF:ORM框架,基于ADO.net開發(fā)的,用了反射和特性。最終由ADO。net負(fù)責(zé)從數(shù)據(jù)庫中讀取數(shù)據(jù),返回EF
特點(diǎn):支持多中數(shù)據(jù)庫,提高開發(fā)效率
強(qiáng)勁的映射引擎,很好的支持存儲(chǔ)過程
集成于VS,可進(jìn)行可視化操作
能夠與asp。net,wpf wcf 等j進(jìn)行很好的集成。
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區(qū)別:IEnumberable調(diào)用skip或者Take前數(shù)據(jù)已經(jīng)加載,IQueryable
是延遲加載,IQueryable繼承IEnumberable
創(chuàng)建線程中唯一EF對(duì)象:使用HttpContext對(duì)象,HttpContext就是微軟封裝的一個(gè)線程對(duì)象
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文件處理視圖的責(zé)任
Model:實(shí)現(xiàn)業(yè)務(wù)邏輯對(duì)實(shí)體類相對(duì)應(yīng)數(shù)據(jù)庫操作。
3層:數(shù)據(jù)訪問層,業(yè)務(wù)邏輯層,表示層。好處分工明細(xì),有利于升級(jí)和維護(hù),壞處帶來一定的性能損失(子程序模塊
未執(zhí)行結(jié)束時(shí),主線程模塊只能處于等待)
MVC好處:便于單元測(cè)試,將代碼與頁面徹底分離
razor:
@:out of//如果不填寫@:,系統(tǒng)會(huì)把out of當(dāng)做C#語句
@using tommy.product //引用命名空間
@model tommy.student[] //引用類
@Html.Raw("
哇哈哈哈
")//輸出是哇哈哈哈
@Html.renderPartial("login")//渲染部分視圖,login是部分視圖名字? @Html.renderPartial("Top",ViewData.Model)
@Html.renderPartial和@Html.Partial區(qū)別在于renderPartial效率高,Partial先緩存@Html.renderPartial和@Html.renderAction:renderPartial直接渲染而renderAction如果要讀取數(shù)據(jù)庫就要他public ActionResult Test(){ViewData["Msg"]="Hello world" return PartialView();}cshtml:@{Html.RenderAction("Test")}
cshtml被訪問時(shí)也編譯成頁面類,繼承WebViewPage,并編譯到此類Execute方法中
在視圖中請(qǐng)求某個(gè)action方法違反了MVC設(shè)計(jì),renderAction會(huì)發(fā)起一個(gè)新request請(qǐng)求
/App_Data 存放私有數(shù)據(jù),例如XML SQLSERVER等
/App_Start? 存放核心配置設(shè)置
路由:它只為片段提取值,從上到下匹配,不會(huì)找最佳匹配值,只會(huì)找最先值
控制器:實(shí)現(xiàn)了IController接口,里面只有Execute方法,RequestContext封裝了當(dāng)前請(qǐng)求和匹配路由信息,控制器不會(huì)渲染視圖
動(dòng)作參數(shù)不允許out和ref,控制器動(dòng)作返回的是ActionResult對(duì)象,然后交給ActionResult對(duì)象中的execute方法中,交給response輸出
ViewResult:默認(rèn)視圖模板
PartialViewResult:默認(rèn)分部視圖模板
RedirectToRouteResult:重定向,根據(jù)路由生成Url
RedirectResult:重定向,特定Url
ContentResult:返回原始的文本數(shù)據(jù)
FileResult:將2進(jìn)制數(shù)據(jù)傳給瀏覽器
JsonResult:Josn格式
JavaScriptResult:
HttpNotFoundResult:返回404--未找到
HttpStatusCodeResult:返回指定的Http碼
EmptyResult:什么不做
return view():返回當(dāng)前請(qǐng)求視圖 return View(“OtherIndex”)return View(“~/views/home”)指定視圖
MVC流程:request--》routing解析--》controllerFactory---》controller--》actionInvoker--》ActionMethod--》response
1,處理未知?jiǎng)幼鳎?如果動(dòng)作調(diào)用器找不到要調(diào)用的動(dòng)作和方法,便從它的InvokeAction方法返回false。這情況下,
controller會(huì)調(diào)用它的handleUnKnownAction方法(404--未找到) protected override void HandleUnknownAction(string actionName)
2,默認(rèn)情況下,控制器支持會(huì)話狀態(tài),它會(huì)銷毀一定內(nèi)存和一些存儲(chǔ)單元空間,使用無會(huì)話可以改善性能.
SessionState(SessionStateBehavior.Disabled)]只會(huì)對(duì)Class有效
SessionStateBehavior.default 默認(rèn)
SessionStateBehavior.required 讀寫會(huì)話狀態(tài)
readOnly 只讀
Disabled 禁用
注意:ViewBag傳遞數(shù)據(jù)不會(huì)受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():創(chuàng)建表單回傳源動(dòng)作方法beginForm(action,controller):指定動(dòng)作和方法beginForm(action,controller,method):beginForm(action,controller,method,attributes):attributes標(biāo)簽屬性名稱beginForm(action,controller,method,routeValues,attributes):
#輸入輔助器:Html.CheckBox() ......
強(qiáng)類型輔助器:Html.CheckBoxFor(x=>x.isApproved) ......
強(qiáng)類型輔助器可以減少由于輸錯(cuò)屬性名稱而引起的錯(cuò)誤,通常會(huì)使用他
5,Ajax
Ajax.BeginForm("GetPeopleData".....)
Ajax.ActionLink
動(dòng)作檢測(cè)ajax請(qǐng)求:if(Request.IsAjaxRequest())
//是一個(gè)key value 和viewBag差不多,它會(huì)在請(qǐng)求結(jié)束后刪除
TempData["message"] = string.Format("{0}has been saved",product.Name);
ViewBag不能跨請(qǐng)求,所有重定向使用他就沒用了
TempData ViewData ViewBag的區(qū)別:
ViewData是字典類型,viewBag是dynamic(動(dòng)態(tài))型,會(huì)在程序運(yùn)行時(shí)動(dòng)態(tài)解析,viewData是object,需要
自己強(qiáng)轉(zhuǎn)換類型,而ViewBag(只讀get)是dynamic。viewBag其實(shí)是viewData,就說多了層dynamic
TempData用于一個(gè)請(qǐng)求中執(zhí)行多個(gè)action方法之間共享數(shù)據(jù),它的值在取得一次值后被刪除
{viewbag.UserName="小李飛刀";ViewData["uername"]="aaa";TempData["username"]="bbbbb";
Preson p=new Preson{username="ccc"}}
@viewbag.UserName @ViewData["UserName"] @TempData["Username"] @Model.username
結(jié)果是:aaa,aaa,bbbbb,ccc 并非:小李飛刀,aaa,bbbbb,ccc viewBag和viewData本質(zhì)一樣被覆蓋了
通過request獲取url?后面的參數(shù):Request.QueryString["jkt"];
常用模型特效標(biāo)簽
displayName,required,stringLenght(20,MinimumLenght=2),Range:驗(yàn)證字段范圍,RegularExpression:自定義驗(yàn)證規(guī)則
if(ModelState.IsValid){}//判斷是否模型驗(yàn)證
路由:
SEO(Search Engine Optimization):漢譯為搜索引擎優(yōu)化。
一個(gè)友好的SEO,URL不超過3層http://localhost/{分類}/{具體頁}使用默認(rèn)路由{controller}/{action}/{id}會(huì)影響網(wǎng)站SEO
性能優(yōu)化:
1,//? 緩存
? ? ? [OutputCache(Duration =5,VaryByParam ="none")]
? ? ? public ActionResult Index()
? ? ? {
? ? ? ? ? ViewBag.Now = DateTime.Now.ToString();
? ? ? ? ? Response.Cache.SetOmitVaryStar(true);//解決隱藏Bug
2,捆綁技術(shù):捆綁和縮小通過減少對(duì)服務(wù)器的請(qǐng)求數(shù)量并減少所請(qǐng)求資產(chǎn)的大?。ㄈ鏑SS和JavaScript)來縮短加載時(shí)間。目前大多數(shù)主流瀏覽器將每個(gè)主機(jī)名的同時(shí)連接數(shù)量限制為6個(gè)。
//默認(rèn)true
public class BundleConfig {
? ? //RegisterBundles 參數(shù)對(duì)象的 Add 方法添加,該方法的參數(shù)需要一個(gè)ScriptBundle 類 或 StyleBundle 類的實(shí)例對(duì)象。
? ? //腳本文件用的是 ScriptBundle 類,樣式文件用的是 StyleBundle 類,它們的構(gòu)造參數(shù)代表著捆綁在一起的文件的引用。
? ? //Include 方法用于包含具體要捆綁的文件。其中的 {version} 是文件版本的占位符,MVC會(huì)在相應(yīng)的目錄下定位到最新的一個(gè)版本文件。
? ? 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文件,而是通過下列優(yōu)雅的方式進(jìn)行: @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();//調(diào)用它
4, MvcHandler.DisableMvcResponseHeader = true;//隱藏MVC版本
測(cè)試框架:A/A/A 準(zhǔn)備/動(dòng)作/斷言
//動(dòng)作
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; 它指示數(shù)據(jù)庫只返回不同的值,它必須直接放在列名的前面,作用于所有的列
SELECT TOP 5 prod_name FROM Products; 返回5行數(shù)據(jù)
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子句可以包含任意數(shù)目的AND和OR操作符。
WHERE vend_id IN ( 'DLL01', 'BRS01' ) IN操作符一般比一組OR操作符執(zhí)行得更快
WHERE NOT vend_id = 'DLL01' 否定其后條件的關(guān)鍵字
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';匹配單個(gè)字符
WHERE cust_contact LIKE '[JM]%' 通配符用來指定一個(gè)字符集 J M
匯總
AVG()? SELECT AVG(prod_price) AS avg_price FROM Products;
返回某列的平均值
COUNT() SELECT COUNT(*) AS num_cust FROM Customers;
返回某列的行數(shù)
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;鏈表查詢
外聯(lián)
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; 復(fù)制表
更新
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