zoukankan      html  css  js  c++  java
  • MVC4学习要点记四

    一、使用原生SQL
    使用EF的一个优点就是自动帮我们生成SQL,这在常规情况下很方便,但有些情况下用EF却不适合。
    另外还有些特别复杂的语句,利用EF很难生成。
    所以,EF提供一组方法用来执行原生的SQL。有以下三种:
    1.DbSet.SqlQuery
    2.Database.SqlQuery
    3.Database.ExecuteSqlCommand
    下面分别说明其用法。

    1、DbSet.SqlQuery
    DbSet.SqlQuery查询并返回Entities

    方框中的和注释掉的内容SysUser sysUser=db.SysUsers.Find(id)完全一样。

    2、Database.SqlQuery
    Database.SqlQuery 返回其他类型
    例如:
    string query = "select loginName from SysUser";
    var names=db.Database.SqlQuery<string>( query).ToList();

    以上会返回一个System.Collections.Generic.List<string>类型。
    这种方式和第一种情况最大的区别就是返回non-entity 类型。
    我们可以根据需要,自己构建需要的类型。

    我们也可以自定义一个entity type让它返回,例如类似我们上一个例子:
    SysUser sysUser = db. Database.SqlQuery(query, paras).SingleOrDefault();
    这样也可以返回entity, 但要注意,这种方式将不会被context track, 返回后就没关系了,如果我们在View中用类似于Model.XXX导航属性获取其他关联数据就会报错。例如@foreach (var item in Model.SysUserRoles),这种情况下会报Model为null的错误。

    3、Database.ExecuteSqlCommand
    最后一个是更新的,直接看示例就明白了:
    context.Database.ExecuteSqlCommand("UPDATE dbo.Posts SET Rating = 5 WHERE Author = @author", new SqlParameter("@author", userSuppliedAuthor));
    存储过程用法类似。

    二、原生SQL使用总结
    1、原生SQL执行查询:
    需要返回实体模型,使用DbSet.SqlQuery (context会跟踪,等效于LINQ方式)
    需要返回其他类型,使用Database.SqlQuery(context不会跟踪

    2、原生SQL执行更新:
    使用Database.ExecuteSqlCommand

    内容来源:
    http://www.cnblogs.com/kevin2013/p/5239190.html

  • 相关阅读:
    POJ 1426 Find The Multiple(数论——中国同余定理)
    POJ 2253 Frogger(Dijkstra变形——最短路径最大权值)
    POJ 3790 最短路径问题(Dijkstra变形——最短路径双重最小权值)
    POJ 3278 Catch That Cow(模板——BFS)
    HDU 1071 The area
    HDU 1213 How Many Tables(模板——并查集)
    POJ 1611 The Suspects
    light oj 1214 Large Division
    POJ 1258 Agri-Net(Prim算法求解MST)
    POJ 2387 Til the Cows Come Home(模板——Dijkstra算法)
  • 原文地址:https://www.cnblogs.com/zhaow/p/9754012.html
Copyright © 2011-2022 走看看