2018-03-16

作者: hui_free | 来源:发表于2018-03-16 13:55 被阅读0次

    泛型:泛型优点:

    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

    相关文章

      网友评论

        本文标题:2018-03-16

        本文链接:https://www.haomeiwen.com/subject/qwnlqftx.html