我爱编程

2018-03-16

2018-03-16  本文已影响0人  hui_free

泛型:泛型优点:

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

上一篇下一篇

猜你喜欢

热点阅读