zoukankan      html  css  js  c++  java
  • DLINQ(九):其它补充

    外部映射文件

           我们可以使用sqlmetal命令行工具来生成外部映射文件,使用方法如下:

    1、开始菜单 -》 VS2008 -》VS工具 -》VS2008命令行提示

    2、输入命令:

    D:"Program Files"Microsoft Visual Studio 9.0"VC>sqlmetal /conn:server=xxx;

    database=Northwind;uid=xxx;pwd=xxx /map:c:"northwind.map /code:c:"northwind.cs

    3、这样,我们就可以在C盘下得到一个xml映射文件和C#的实体类代码

    4、把.cs文件添加到项目中来(放到App_Code目录),然后使用下面的代码加载映射文件:

    String path = @"C:"Northwind.map";

    XmlMappingSource xms = XmlMappingSource.FromXml(File.ReadAllText(path));

    Northwind ctx = new Northwind("server=xxx;database=Northwind;uid=xxx;pwd=xxx", xms);

    5、现在就可以照常进行其它工作了。使用sqlmetal可以很方便的同步数据库与实体和映射文件。每次修改数据库结构,从dbml设计器上删除表、存储过程然后再重新添加也是很麻烦的事情。

     

    处理空值

              var count = (from c in ctx.Customers where c.Region == null select c).Count();

            Response.Write(count + "<br/>");

            var query = from emp in ctx.Employees select emp.ReportsTo;

            foreach (Nullable<int> r in query)

            {

                Response.Write(r.HasValue ? r.Value.ToString() + "<br/>" : "没有<br/>");

            }

           代码执行后捕获到下面的SQL被执行:

    SELECT COUNT(*) AS [value]

    FROM [dbo].[Customers] AS [t0]

    WHERE [t0].[Region] IS NULL

    SELECT [t0].[ReportsTo]

    FROM [dbo].[Employees] AS [t0]

     

    已编译查询

           对于一些在项目中经常被用到的查询可以封装成已编译查询,这样就能提高执行效率:

    static class Queries

    {

        public static Func<NorthwindDataContext, string, IQueryable<Customer>>

            CustomersByCity = CompiledQuery.Compile((NorthwindDataContext ctx, string city) => from c in ctx.Customers where c.City == city select c);

    }

           调用查询方式如下:   

            GridView1.DataSource = Queries.CustomersByCity(ctx, "London");

            GridView1.DataBind();

     
    获取一些信息

            var query = from c in ctx.Customers select c;

            Response.Write("Provider类型:" + ctx.Mapping.ProviderType + "<br/>");

            Response.Write("数据库:" + ctx.Mapping.DatabaseName + "<br/>");

            Response.Write("表:" + ctx.Mapping.GetTable(typeof(Customer)).TableName + "<br/>");

            Response.Write("表达式:" + query.Expression.ToString() + "<br/>");

            Response.Write("sql" + query.Provider.ToString() + "<br/>");

           上面的代码执行结果如下:

    Provider类型:System.Data.Linq.SqlClient.SqlProvider
    数据库:Northwind
    表:dbo.Customers
    表达式:Table(Customer).Select(c => c)
    sql
    SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax] FROM [dbo].[Customers] AS [t0]

     

    撤销提交

            var customer = ctx.Customers.Single(c => c.CustomerID == "AROUT");

            customer.ContactName = "zhuye";

            customer.Country = "Shanghai";

            Response.Write(string.Format("Name:{0},Country:{1}<br/>", customer.ContactName, customer.Country));

            customer = ctx.Customers.GetOriginalEntityState(customer);

            Response.Write(string.Format("Name:{0},Country:{1}<br/>", customer.ContactName, customer.Country));

           上面的代码执行效果如下:

    Name:zhuye,Country:Shanghai
    Name:Thomas Hardy,Country:UK

     

    批量操作

           下面的代码会导致提交NDELETE操作:

            var query = from c in ctx.Customers select c;

            ctx.Customers.RemoveAll(query);

            ctx.SubmitChanges();

           应该使用sql语句进行批操作:

            string sql = String.Format("delete from {0}", ctx.Mapping.GetTable(typeof(Customer)).TableName);

            ctx.ExecuteCommand(sql);

           对于批量更新操作也是同样道理。

  • 相关阅读:
    leetcode 29-> Divide Two Integers without using multiplication, division and mod operator
    ros topic 发布一次可能会接收不到数据
    python中的print()、str()和repr()的区别
    python 部分函数
    uiautomatorviewer错误 unable toconnect to adb
    pyqt 不规则形状窗口显示
    appium 计算器demo
    Spring 3.0 注解注入详解
    Spring Autowire自动装配
    restful 学习地址
  • 原文地址:https://www.cnblogs.com/qfb620/p/1116074.html
Copyright © 2011-2022 走看看