全球彩票平台_全球彩票注册平台|官网下载地址

热门关键词: 全球彩票平台,全球彩票注册平台,全球彩官网下载地址

全球彩票注册平台行使开荒之Linq和EF,NET深切实

Java进击C#——应用开垦之Linq和EF,

本章简言

上一章小编对于WinForm开辟进度用到的多少个知识点做了讲学。大家方能够此为初阶举行学习。而本章我们来说八个跟ORM观念有关的知识点。在讲在此之前让我们想转手有关JAVA的hibernate知识点。hibernate也是ORM框架。记得hibernate里面有七个叫HQL。先不管HQL的好与坏。主假若知情HQL的目地是哪些。ORM的思维正是为了让客商在操作数据的时候用上面向对象的考虑来看,并不是二维数据了。所以HQL小编以为就是二个面向对象思想的SQL语句。那么为啥我要讲到HQL呢?事实上作者以为Linq有好几跟他好像。倘若项目架构是三层的话,就是让业务层的开辟人士不用在看二维数据了。就连SQL语句都以面向对象观念形式来操作了。而EF(Entity Framework)能够说正是hibernate。正是能够通晓为Linq的数据源。然而HQL要在hibernate上面技术有功力。Linq却能够不用EF。

Linq语法

全球彩票注册平台,.NET对于Linq知识的分类让笔者有时候以为很无力。为何吗?最先的时候小编感到Linq知识点分三大块。分别为Linq to SQL、Linq to Entity、Linq to Database。随着对Linq使用的扩张却开掘还会有Linq to Xml 、Linq to Excel等。作者想读者们是或不是来看门道来了。能够说.NET在设计Linq的时候,应该是有充裕的想过未来扩充的题材。当然那不是本章的对象。小编在付出进度中最常用的就是Linq to SQL和 Linq to Entity。别的还应该有一个叫Linq to Object.对于Linq to Object小编一向感到正是Linq to Entity。笔者的情致是指他们的学问该应放在一块儿。好了。先作者讲一下关于Linq to SQL。

对于Linq to SQL来说,只要学习SQL语法的人都毫不顾忌很轻易就上手。记得笔者学习的时候,一看笔者去不就HQL的另一种形态呢?当然 HQL可不是Linq如故要读书一下的。讲那么多没有用。用列子才是最棒的。

一、建立EF环境。先建二个品类,然后通过NUGET来博取对应的EF的DLL。对于NUGET是何许。相信看过《Java进击C#——项目费用条件》的人应有能够理解到。接纳“引用”右击》管理Nuget程序包。

全球彩票注册平台 1

相信看了地点的图样的时候,我们早就发掘了EntityFramework了吧。点击“安装”就足以了。那年项目就能多出一个叫packages.config文件。那其间著录着日前设置的dll消息。同有时间物理目录里面会多出四个文书夹packages来存在这几个dll。

全球彩票注册平台 2

作者们看到援用里面多出了关于EF的引用dll。这年大家就能够做EF的业务了。

二、新建EF上下文。EF有二个十分重大的类。能够说是读书EF的大旨点。这几个类正是DbContext。小编新建一类叫AomiContext承袭他。如下

public class AomiContext : DbContext
{

}

DbContext类有多少个构造函数。笔者这里讲一个常用的吧。如下

 public DbContext(string nameOrConnectionString);

正是个构造函数意思正是传一个接连字符串或是配置文件的连接字符的配备名。记得上一节中讲的App.config了呢。没错就是要用到他。看一下笔者写的内容吗。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="aomi" connectionString="Data Source=.;Initial Catalog=Ado;Persist Security Info=True;User ID=sa;Password=123" providerName="System.Data.SqlClient"/>
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

地点的connectionStrings部分是我自身写的。别的是自动生成的。.NET自身有多少个布局连接字符串的节点。大家便是在那些节点上写入本身的总是就足以了。

<add name="aomi" connectionString="Data Source=.;Initial Catalog=Ado;Persist Security Info=True;User ID=sa;Password=123" providerName="System.Data.SqlClient"/>

好了。接下来就是把AomiContext类修改一下。让他跟对应的连日字符串的安插发生关系。如下

 public class AomiContext : DbContext
    {
        public AomiContext()
            : base("Aomi")
        { }
    }

见状石榴红部分的代码了吗。把Aomi就是对应上边配置add节点的name的值。今年EF会自个儿去安排文件之中去找。

三、创建表和类的炫目。

对应数据库的表:

CREATE TABLE [dbo].[Catalogs](
    [ID] [int] NOT NULL,
    [CatalogName] [nvarchar](50) NULL,
    [CatalogCode] [nvarchar](50) NULL,
 CONSTRAINT [PK_Catalogs] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

对应数据库的数额

INSERT [dbo].[Catalogs] ([ID], [CatalogName], [CatalogCode]) VALUES (1, N'小吃', N'c0001')
INSERT [dbo].[Catalogs] ([ID], [CatalogName], [CatalogCode]) VALUES (2, N'计算机', N'c0002')

小编建多少个类用于跟数据Curry面包车型客车表相对应。今年要记得属性要跟表里里面的列名同样子才行。代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LinqExample
{
    public class Catalogs
    {
        public int ID { set; get; }

        public string CatalogName { set; get; }

        public string CatalogCode { set; get; }
    }
}

有了对应的类之后,还百般。我们还要修改一下AomiContext类。这样子就足以由此AomiContext类来访问对应的类对象了。就是数据了。如下

    public class AomiContext : DbContext
    {
        public AomiContext()
            : base("Aomi")
        { }

        public IDbSet<Catalogs> Catalogs { set; get; }
    }

四、执行EF。

 class Program
    {
        static void Main(string[] args)
        {
            using (AomiContext ac = new AomiContext())
            {
                IQueryable<Catalogs> queryable = from c in ac.Catalogs select c;
                List<Catalogs> catalogList = queryable.ToList();

                foreach (Catalogs catalog in catalogList)
                {
                    Console.WriteLine(string.Format("ID:{0} CatalogName:{1}", catalog.ID, catalog.CatalogName));
                }
            }

            Console.ReadKey();
        }
    }

执行结果:

全球彩票注册平台 3

从地点的例证我们能够看到用了from c in ac.Catalogs select c;来赢得相应的多少。那正是linq to sql。简章讲他是一个面向对象的SQL语句。SQL语句是以select最初,结尾不分明。而linq to sql一般是以from最初,以select结尾。表示从哪二个数据源早先,最终要以什么体统重临。但是大家得以看出她重回是多少个IQueryable<T>类型。事实这一年他并不曾去施行得到数据。能够解理为她未来只是去组装SQL语句。只到queryable.ToList();才是去执行得到多少。为了学习上的惠及笔者又加多少个基本点字让大家看一下。

using (AomiContext ac = new AomiContext())
            {
                IQueryable<Catalogs> queryable = from c in ac.Catalogs where c.CatalogName.Contains("吃") orderby c.CatalogCode ascending select c;
                List<Catalogs> catalogList = queryable.ToList();

                foreach (Catalogs catalog in catalogList)
                {
                    Console.WriteLine(string.Format("ID:{0} CatalogName:{1}", catalog.ID, catalog.CatalogName));
                }
            }

看完了linq to sql之后,让作者看一下关于linq to entity又是怎么着东东呢?但是那样子讲linq的语法都一般。只是用法和写法不同子而以。把上边的事例变一变呢。

 using (AomiContext ac = new AomiContext())
            {
                //IQueryable<Catalogs> queryable = from c in ac.Catalogs where c.CatalogName.Contains("吃") orderby c.CatalogCode ascending select c;
                IQueryable<Catalogs> queryable = ac.Catalogs.Where(t => t.CatalogName.Contains("吃")).OrderBy(t => t.CatalogCode).Select(c=> c);
                List<Catalogs> catalogList = queryable.ToList();
                foreach (Catalogs catalog in catalogList)
                {
                    Console.WriteLine(string.Format("ID:{0} CatalogName:{1}", catalog.ID, catalog.CatalogName));
                }
            }

来看作者不用多说也领略。就是形成了相应的要紧字方法而以。没错。便是那样子。那个时候小编就足以那样子感觉不论是Linq to entity照旧Linq to sql都必供给有相应的数据源。这里EF正是为她们提供数据源的。他们俩个关照都是回去IQueryable<T>类型。只是Linq to entity是用艺术。而Linq to sql更加的多像SQL语句。

好了。让大家看一下有关linq to object吧。能够这么了讲吧——不管是Linq to sql照旧linq to entity他们俩个都离不开linq to object。linq to object是专对内存中的数据进行拍卖。我们能够观察上边例子中有现身一段queryable.ToList()。要是作者说ToList()是linq to object会不会有人喷笔者。为何笔者说他是linq to object呢?首假使ToList()是对于IEnumerable<T>举办静态扩充的。IEnumerable<T>一般都是用于数组和聚众。位于内部存款和储蓄器中的。而地点都以专对于IQueryable<T>类型的。好了。倘令你其实认为笔者分的反常的话,这便是无须分了。都为Linq语法就行了。linq还提供了一些比较常用的办法。

First:重返首个数据。未有数量就诞生极度。同一时间也得以流传第贰个数据的原则作为参数。如queryable.First(t => t.CatalogName.Contains("吃"));。

FirstOrDefault:同样子再次来到第贰个数据,未有数据以来,就回到NULL。同时也能够流传第八个数据的规范作为参数。

Last:同理获得最后一艺术。用法同上同样子。

LastOrDefault:同上同样子。跟FirstOrDefault用法一样子。

Skip:给定一个数字,那么数字前面都不会抽取来,后以的才收取来。一般都跟Take方法一齐用来作分页作用。

Take:表示要回来的数量。你能够精通为SQL语句中的TOP关键字。

让作者举个linq to object的列子吧。

List<string> src = new List<string>();
src.Add("a1");
src.Add("b2");
src.Add("c4");
src.Add("d5");
string value = src.First(t => t.StartsWith("a"));
Console.WriteLine(value);

留意:作者是这么子分的。一般静态扩大IQueryable<TSource> 的方式属于linq to entity。而静态扩张IEnumerable<TSource>则为linq to object。俩者很像。只是linq to entity必供给有数据源。linq to object一般是管理内部存款和储蓄器数据。

Entity Framework

Entity Framework做为ORM框架之一。所以ORM框架必得有的东西他多有。学习Entity Framework就不可能不知道他有什么样知识点。Entity Framework依照开发方式的例外分为Code First、Model First和Database First。让小编用土一点的传道来说吧。

Code First方式:正是透过写代码来变化对应的数据库和表。

Model First形式:事实上跟Code First有一点点像。只是他用了.NET的二个叫xxx.edmx的文本来操作而以。通过她来变化对应的数据库和表。

Database First情势:却眼前边俩个相反。先建数据库和表在生成对的类。便是代码。

作者们未来要读书Entity Framework。小编个人观点读者们最佳选拔Code First方式来学习。为何。不管是Model First方式依然Database First形式超过半数都以软件工具帮您转移对应的代码。所以重重事物大家平素看不到。而Code First形式正是要开垦职员手把手的写了。记得作者在使用hibernate的时候。并从未说只做一方面包车型大巴政工。一般都以数据库的表建完将来。如故要去写对应的投射配置文件(xxx.hbm.xml)。好一些就和睦写多个代码生成器。Entity Framework意图就是帮开辟人士做掉一边的办事。然则那也是笔者不欣赏的。正因为这么子Entity Framework多出了多个知识点那就是数额迁移。大家都知情在支付的历程中。只怕会因为那时表未有规划好。顿然意识须要追加八个字段。那样个时候Entity Framework将在做过多事务。借使我们用的是Code First吧。大家在代码中的类扩张叁特性质。这一年Entity Framework便是要去看清哪些属性是旧的。哪些属性是修改的。哪些属性是新扩张的。然后Entity Framework在立异数据库。正是Entity Framework的数据迁移。

从地点的教师中我们了然EF想帮自身做了另一半的业务,所以就必得对数据库操作才行。那么固然存在对数据库设置,对表安装,对数据操作。以下全部是在在Code First形式下的讲说。

1、EF对数据库的设置。施行代码的时候,EF会去看清是还是不是留存对应的数据库。而对数据库进行操作。是创办或然删除在开立。照旧更新呢?首要看您设置相应的数据库操作的格局。那么EF为我们提供了七个。当然大家得以团结写贰个。多个类都在System.Data.Entity命名空间下。分别是CreateDatabaseIfNotExists、DropCreateDatabaseAlways、DropCreateDatabaseIfModelChanges。文英好的人都能看得懂是怎样一会事。

 public AomiContext()
            : base("Aomi")
        {
            Database.SetInitializer<AomiContext>(new CreateDatabaseIfNotExists<AomiContext>());
        }

注意:关于Database.SetInitializer方法的赋值是能够放在其他地点。但确定要实行EF在此之前。

2、EF对表的设置。那么些设置大部是有关表和表与表之间的涉及怎么着突显在类和类与类之间的关联。上边作者做了一个大致的映射例子。

 public class AomiContext : DbContext
    {
        public AomiContext()
            : base("Aomi")
        { }

        public IDbSet<Catalogs> Catalogs { set; get; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Configurations.Add(new CatalogsMap());

        }
    }

上面CatalogsMap类就相当于映射配置文件(xxx.hbm.xml)。当中囊括一对一,一对多,多对多等等的涉及也是在此处配置。有少数要注意的是上面水草绿代码。就是把映射关系走入EF配置内部

 public class CatalogsMap : EntityTypeConfiguration<Catalogs>
    {
        public CatalogsMap()
        {
            this.HasKey(t => t.ID);
            this.Property(t => t.CatalogName).HasColumnName("CatalogName");
            this.Property(t => t.CatalogCode).HasColumnName("CatalogCode");
        }
    }

3、对数据的操作。对数据的操作一般正是增加和删除改查了。

增加:

using (AomiContext ac = new AomiContext())
{
      Catalogs catalogs = new Catalogs();
      catalogs.ID = 6;
      catalogs.CatalogName = "商品";
      catalogs.CatalogCode = "s0001";
      ac.Catalogs.Add(catalogs);

      ac.SaveChanges();
}

实情方面包车型地铁代码是从未有过难题。可是推行的时候却会发出错误。为何吗?作者亦非领略怎么着原因。查找未有毛病。不过在大增却会出标题。让自身看一下特别吧。这里作者只复制出一部分。

       InnerException: System.Data.SqlClient.SqlException
            _HResult=-2146232060
            _message=不能将值 NULL 插入列 'ID',表 'Ado.dbo.Catalogs';列不允许有 Null 值。INSERT 失败。
语句已终止。
            HResult=-2146232060
            IsTransient=false
            Message=不能将值 NULL 插入列 'ID',表 'Ado.dbo.Catalogs';列不允许有 Null 值。INSERT 失败。
语句已终止。
            Source=.Net SqlClient Data Provider
            ErrorCode=-2146232060
            _doNotReconnect=false

她说自个儿的ID未有设置值,然则小编设置了。作者想你们一定会以为是从未设置标记。也便是机关增进。不是那样子的。作者本来正是从未想过要自行增加哟。那么为何会错吧?事实笔者也是以那样子的角度去想的。会不会EF暗许就认为ID是自动增进。因为ID是int类型的。又是主键。所以作者就在炫酷配置内部加了一段代码。如下

 public class CatalogsMap : EntityTypeConfiguration<Catalogs>
    {
        public CatalogsMap()
        {
            this.HasKey(t => t.ID);
            this.Property(t => t.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
            this.Property(t => t.CatalogName).HasColumnName("CatalogName");
            this.Property(t => t.CatalogCode).HasColumnName("CatalogCode");
        }
    }

庚午革命部分正是充实的代码。这一年就不会出错了。那么这段代码是何等看头。正是报告EF这里的ID只是一般的。未有别的设置。

修改:

using (AomiContext ac = new AomiContext())
{
     Catalogs updateCatalogs = ac.Catalogs.FirstOrDefault(t => t.ID == 4);
     updateCatalogs.CatalogName = "纸类";

     ac.SaveChanges();
}

删除:

using (AomiContext ac = new AomiContext())
{
 Catalogs deleteCatalogs = ac.Catalogs.FirstOrDefault(t => t.ID == 1);
 ac.Catalogs.Remove(deleteCatalogs);

 ac.SaveChanges();
}

作者在做EF的增加和删除改的时候,我心里面一贯在想俩个难点?

率先:EF并不曾像Hibernate那样子。有增添的主意和立异的诀窍。他唯有一种概念那就是数码有未有发生更换。遵照更换多少来更新数据库的数额。

其次:Hibernate在拍卖对象的时候。会用到目的的二种处境。那三种处境在不相同的书里头有不相同的叫法。作者一般喜欢叫他们为普通状、悠久状、游离状。但是假使把Hibernate那几个知识放在EF那边来的话,亦不是说不可能。只是认为那个时候有好几怪。EF那边并未像样相关的注脚。可是笔者依然感觉有不可缺少用她放在EF那边。为何呢?先让大家看一下状态吗。假诺大家把上边的ID变成了标记。即为自动拉长。在加码的时候就不曾须要去设置那些值。那么增添成功之后我们要若是去取得相应的ID值呢?难道在收获三回呢?鲜明不是。如下。

class Program
    {
        static void Main(string[] args)
        {
            using (AomiContext ac = new AomiContext())
            {
                Catalogs catalogs = new Catalogs();
                catalogs.ID = 0;
                catalogs.CatalogName = "商品";
                catalogs.CatalogCode = "s0001";
                ac.Catalogs.Add(catalogs);

                ac.SaveChanges();

                Console.WriteLine("ID:"   catalogs.ID);
            }

            Console.ReadKey();
        }
    }

作者把地点的数目总体剔除掉。並且把Catalogs表的列ID修改为标志。就是自动增进。在新建Catalogs对象的时候把ID设置为0。然后我们在看一下充实成功以往ID是否依旧为0。然而记得把CatalogsMap类里面包车型大巴照耀配置修改一下。修改如下。

 this.Property(t => t.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

好了,让大家看一下结实值是多少。如下。大家看看是7。为啥不是0。作者的SQL Server的标记是从6方始的。所以那边是7。借令你们一伊始的话。是1。但决对不是0。为啥?正是因为对象产生了持久状了。

全球彩票注册平台 4

普通状:便是健康用关键字new来创设。

悠久状:就是由此EF之后,比如扩展。这年对象跟数据库同步。

游离状:关闭EF之后的对象。不过笔者认为EF未有这种情景。因为Hibernate有唤醒这些职能。

本章总结

本章首要讲到关于Linq和EF的知识点。Linq的一部分入门用法和EF的宗旨知识点。当然,有关EF的类与类之间的涉及和数码迁移作者小编必未有说。希望读者们自行查看。

本章简言 上一章小编对于WinForm开采进度用到的多少个知识点做了疏解。小编们方能够此为开端进行学习。...

本章简言
本章简言

  在劳碌中走过了5,6,7 月份,未来些抽点时间对Entity Framework的运用做一些基础的追忆。

.NET深远实战体系—Linq to Sql进级

 

近年在写代码的进度中用到了Linq查询,在查找资料的历程中窥见网络的资料千奇百怪,于是自身收拾了部分关于Linq中轻松令人狐疑的地方。

正文全体代码基于:UserInfo与Class多个表,在那之中Class中的UserId与UserInfo中的Id对应

全球彩票注册平台 5

 本文独一采访地址:

上一章小编对于WinForm开荒进度用到的多少个知识点做了讲课。小编们得以以此为起先实行学习。而本章我们来说贰个跟ORM观念有关的知识点。在讲在此以前让我们想转手有关JAVA的hibernate知识点。hibernate也是ORM框架。记得hibernate里面有三个叫HQL。先不管HQL的好与坏。主假若知道HQL的目地是何等。ORM的观念正是为着让顾客在操作数据的时候用下边向对象的企图来看,而不是二维数据了。所以HQL小编以为正是一个面向对象观念的SQL语句。那么为何作者要讲到HQL呢?事实上作者以为Linq有几许跟她近乎。倘若项目架构是三层的话,正是让业务层的开荒职员不用在看二维数额了。就连SQL语句都是面向对象观念方式来操作了。而EF(Entity Framework)能够说便是hibernate。便是能够领略为Linq的数据源。可是HQL要在hibernate上边本领有机能。Linq却可以不用EF。

上一章作者对于WinForm开辟进度用到的多少个知识点做了教学。小编们方能够此为开始举行学习。而本章大家来说七个跟ORM观念有关的知识点。在讲此前让我们想转手有关JAVA的hibernate知识点。hibernate也是ORM框架。记得hibernate里面有三个叫HQL。先不管HQL的好与坏。重要是掌握HQL的目地是如何。ORM的怀念就是为了让客商在操作数据的时候用下边向对象的斟酌来看,并非二维数据了。所以HQL我以为便是三个面向对象观念的SQL语句。那么为啥作者要讲到HQL呢?事实上我感到Linq有好几跟她看似。假如项目架构是三层的话,就是让业务层的开拓职员不用在看二维数码了。就连SQL语句都以面向对象观念格局来操作了。而EF(Entity Framework)能够说正是hibernate。就是能够知晓为Linq的数据源。不过HQL要在hibernate上边能力有成效。Linq却足以不用EF。

Entity Framework 是什么?

  Entity Framework(EF)和我们所耳濡目染的ADO.NET大概,都提供对数据库访谈和操作的指标,可是个别也迥然不一致之处。

  ADO.NET提供了一套对底层数据库操作的对象模型,抽象档案的次序较底,操作功能和性质较高,是日常开销中做客数据库常用情势。

  EF的抽象档期的顺序较高:它把数据库映射为DbContext,把数据库对象都转变到应用程序对象 (entity),而数据字段都更改为属性 (property),关系则转移为组合属性 (association)。在系统开垦上晋级了大多频率,使用EF能很轻松进步易维护,易扩大的类别。

  EF 同时也协理 Linq , Lambda 编写查询等唇齿相依数据库操作,不须求懂SQL语法也能运用自如操作数据库。

  因为EF把数据库对象都调换来实体对象存款和储蓄在内部存款和储蓄器中,所以EF在使用进程中是比较占内部存款和储蓄器。加上抽象等级次序较高在访谈底层数据库模型需做调换,在数据库操作质量上相似没ADO.NET高。那是在享用EF的流弊。

  EF在档期的顺序中器重是一个:*.edmx文件。EF 首要分为三层:

  (1)概念模型(Conceptual Model):首要展示为一组能够被应用程序直接运用的类。这一个类也是我们在前后相继中平昔动用的类,平常称为“实体(Entity)”

  (2)存款和储蓄模型(Storage Model):首要显示为一组与底层数据存款和储蓄介质(举个例子数据库系统)直接对应的类。

  (3)概念-存款和储蓄模型映射(Conceptual- Storage Mapping),化解“概念模型”中的类怎么着与“存款和储蓄模型”中的类互相照看的主题素材。

linq联合查询

Linq语法
Linq语法

Entity Framework 创建

1.在VS二〇一三创造EF文件,并采取Database First开采方式。全球彩票注册平台 6

全球彩票注册平台 7

2.配置EF所需连接的数据库。

全球彩票注册平台 8

全球彩票注册平台 9

3.布置实现后我们得以看出EF的面目。侧边呈现为:数据库对应表的炫目内容。 

全球彩票注册平台 10

4.在左边空白处右键-->"映射详细新闻"能够查询数据库映射表的详实内容可做相应修改, “模型浏览器”能够查询到EF的三层结构:概念模型,概念-存款和储蓄模型映射,存款和储蓄模型。

全球彩票注册平台 11

全球彩票注册平台 12

 

内联合检查询


内联是叁个其实运用作用非常高的询问,它查询多个表共有的且都不为空的一些

from user in UserInfo  
join c in Classes on user.Id equals c.UserId  
select new  
{  
    user.UserName,  
    user.Id,  
 c.ClassName  
} 

询问结果

全球彩票注册平台 13

对应的SQL语句

SELECT [t0].[UserName], [t0].[Id], [t1].[ClassName]  
FROM [UserInfo] AS [t0]  
INNER JOIN [Class] AS [t1] ON [t0].[Id] = [t1].[UserId] 

.NET对于Linq知识的分类让笔者有的时候候感到很无力。为何吧?最初的时候小编认为Linq知识点分三大块。分别为Linq to SQL、Linq to Entity、Linq to Database。随着对Linq使用的加码却开掘还大概有Linq to Xml 、Linq to Excel等。作者想读者们是还是不是看看门道来了。能够说.NET在设计Linq的时候,应该是有充足的想过以往扩展的主题材料。当然那不是本章的指标。作者在开荒进度中最常用的正是Linq to SQL和 Linq to Entity。其它还会有三个叫Linq to Object.对于Linq to Object小编一贯感觉正是Linq to Entity。作者的情致是指他们的文化该应放在一齐。好了。先作者讲一下有关Linq to SQL。

.NET对于Linq知识的归类让小编不经常候认为很无力。为何吧?最先的时候笔者认为Linq知识点分三大块。分别为Linq to SQL、Linq to Entity、Linq to Database。随着对Linq使用的扩展却开掘还也可能有Linq to Xml 、Linq to Excel等。作者想读者们是否看出门道来了。可以说.NET在设计Linq的时候,应该是有丰裕的想过今后扩张的主题材料。当然那不是本章的指标。笔者在开拓进度中最常用的正是Linq to SQL和 Linq to Entity。其他还会有一个叫Linq to Object.对于Linq to Object作者一贯认为正是Linq to Entity。作者的意趣是指他们的学识该应放在一块儿。好了。先作者讲一下关于Linq to SQL。

Entity Framework 使用CRUD

  1. 扩大数据

    WebSiteDBEntities entity = new WebSiteDBEntities();

    Users user = new Users() {

     Account = "9245162",
     Code = "10003",
     Pwd = "123456",
     Isadmin = true
    

    }; entity.Users.Add(user); entity.SaveChanges();

实施结果:

全球彩票注册平台 14

2.查询数据

//Linq 查询
var Query_User_TO_Linq = from c in entity.Users where c.Account == "9245162" select c;
foreach (var Users in Query_User_TO_Linq)
    Console.WriteLine("Linq 查询结果:帐号:{0},编码:{1}", user.Account, user.Code);

//Lambda 查询
var Query_User_TO_Lambda = entity.Users.Where(c => c.Account == "9245162").ToList();
foreach (var Users in Query_User_TO_Lambda)
    Console.WriteLine("Lambda 查询结果:帐号:{0},编码:{1}", user.Account, user.Code);

//SQL 查询
var Query_User_TO_SQL = entity.Users.SqlQuery("Select * from Users Where Account='9245162' ").ToList();
foreach (var Users in Query_User_TO_SQL)
    Console.WriteLine("SQL 查询:帐号:{0},编码:{1}", user.Account, user.Code);

实践结果:

全球彩票注册平台 15

3.修改数据

Users uuser = entity.Users.First(c => c.Code == "10003");
uuser.Account = "CK9245162";
entity.Users.Attach(user);
entity.Entry(uuser).State = System.Data.EntityState.Modified;
entity.SaveChanges();

4.删减数据

Users duser = entity.Users.First(c => c.Account == "9245162");
entity.Users.Remove(duser);
entity.SaveChanges();

 

左联合检查询


from user in UserInfo    
join c in Classes on user.Id equals c.UserId into temp    
from c in temp.DefaultIfEmpty()    
select new    
{    
     user.UserName,    
     user.Id,    
     c.ClassName    
}

查询结果

全球彩票注册平台 16

对应SQL语句

SELECT [t0].[UserName], [t0].[Id], [t1].[ClassName] AS [ClassName]  
FROM [UserInfo] AS [t0]  
LEFT OUTER JOIN [Class] AS [t1] ON [t0].[Id] = [t1].[UserId]  

!注意一下中国左翼小说家联盟那多少个【temp】,它实质上是二个IEnumerable集合。所以大家能够获得到中国左翼诗人联盟的另一种结果:

from user in UserInfo  
join c in Classes on user.Id equals c.UserId into temp  
select new  
{  
    user,  
    temp  
}  

询问结果(为了更明了表述集结,在Class表里特意加了一条记下,所以class那边共有3条)

全球彩票注册平台 17

对应SQL语句,与中国左翼小说家联盟的SQL基本等同,但多了一个总计行数的列

SELECT t0.*, [t1].[Id] AS [Id2], t1.*, (  
    SELECT COUNT(*)  
    FROM [Class] AS [t2]  
    WHERE [t0].[Id] = [t2].[UserId]  
    ) AS [value]  
FROM [UserInfo] AS [t0]  
LEFT OUTER JOIN [Class] AS [t1] ON [t0].[Id] = [t1].[UserId]  

全联连是猎取三个表的穿插结果(在SQL中称之为cross join),这种联连格局得到的结果在并未有过滤条件的动静下,基本没什么用。看看就可以,代码如下:

from user in UserInfo  
from c in Classes  
select new  
{  
    user.UserName,  
    user.Id,  
 c.ClassName  
}  

询问结果

全球彩票注册平台 18

对应SQL语句

SELECT [t0].[UserName], [t0].[Id], [t1].[ClassName]  
FROM [UserInfo] AS [t0], [Class] AS [t1]  

对于Linq to SQL来说,只要学习SQL语法的人都不用忧郁很轻巧就上手。记得小编学习的时候,一看本人去不就HQL的另一种形象呢?当然 HQL可不是Linq依旧要上学一下的。讲那么多未有用。用列子才是最棒的。

对此Linq to SQL来说,只要学习SQL语法的人都毫无怀想很轻松就上手。记得小编学习的时候,一看自身去不就HQL的另一种形态呢?当然 HQL可不是Linq依然要上学一下的。讲那么多未有用。用列子才是最棒的。

Entity Framework  三种开采形式

DataBase First: 古板的表驱动情势创建edm,然后通过edm生成模型和数据层代码。
Model First : 先成立edm模型,再生成DDL数据库脚本和模型和数据层代码。
Code First : 手动创造POCO模型,数据层DbContext及映射关系,通过Database.SetInitializer生成数据库,这种办法较活络,可是代码职业比较多。

 

合并(Union)


这种查询其实也很少用,但在好几变态业必需要下会非常有用,注意查询的结果。它是联合七个表一样列数的结果,而且只要结果中有平等的行,那么只取一行记录。

(  
    from userinfo in UserInfo  
    select new {  
      Id = (System.Int32?)userinfo.Id,  
      Name = userinfo.UserName  
    }  
).Union  
(  
    from c in Classes  
      select new {  
      Id = (System.Int32?)c.UserId,  
      Name = c.ClassName  
    }  
)  

查询结果

全球彩票注册平台 19

对应SQL语句

SELECT [t0].[Id] AS [value], [t0].[UserName]  
FROM [UserInfo] AS [t0]  
UNION  
SELECT [t1].[UserId] AS [value], [t1].[ClassName]  
FROM [Class] AS [t1]

一、建立EF环境。先建二个体系,然后通过NUGET来获得对应的EF的DLL。对于NUGET是怎么。相信看过《Java进击C#——项目支付条件》的人应当可以驾驭到。选取“援用”右击》管理Nuget程序包。

一、建立EF环境。先建二个门类,然后通过NUGET来取得对应的EF的DLL。对于NUGET是如何。相信看过《Java进击C#——项目开销条件》的人应有可以通晓到。采用“援引”右击》管理Nuget程序包。

Linq 分组查询

分组查询(group by)也是我们在其实项目中贰个常用的操作,查询操作如下:

from c in Classes  
group c by c.UserId into temp  
select temp 

询问结果

全球彩票注册平台 20

 

瞩目一下询问结果,外层是一个我们常用的IQueryable<T>,里面是叁个近似Dictionary的K-V集结。轻巧点说Group再次来到的是三个聚众的聚合,由此输出时需用双重循环。

我们在应用它的结果时,应该那样调用:

var result = from c in _context.Classes  
               group c by c.UserId  
               into temp  
               select temp;  

           foreach (var c in result)  
           {  
               Console.WriteLine(c.Key);  
               foreach (var citem in c)  
               {  
                   Console.WriteLine(citem.ClassName);  
               }  
           } 

全球彩票注册平台 21

全球彩票注册平台 22

实体扩展字段管理

自身在本文例子中的UserInfo实体类如下:

public partial class UserInfo  
   {  
       public int Id { get; set; }  
       public string UserName { get; set; }  
       public string UserType { get; set; }  
       public int Money { get; set; }  
   }

如今本人想在该实体中类中增加三本性格。为了保全原实体类的天真。笔者增添二个新的partial类:

public partial class UserInfo  
    {  
        /// <summary>  
        /// 测试扩展属性  
        /// </summary>  
        public string UserExt  
        {  
            get { return UserName   ":"   UserType; }  
        }  
    } 

接下来大家用EF访谈一下,发现是能够访谈的:

全球彩票注册平台 23

但假使大家这么使用时:

from user in _context.UserInfoes
select new
{
    user.Id,
    user.UserExt
};

会意识编写翻译是从未难题的。但运行时会出现下边万分:

全球彩票注册平台 24

切切实实错误音讯如下: The specified type member 'UserExt' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

即"UserExt"类型并不可能被linq协助。因为在步向到foreach进行真正取多少在此以前。EF已经把linq转成SQL语句,而UserExt会被转成对应的数据库字段。因为数据库中并从未该字段,所以会现出这一个标题。消除的艺术非常粗大略:

from user in _context.UserInfoes.ToList()  
select new    
{    
    user.Id,    
    user.UserExt    
};   

即先施行ToList(),提前让linq实行施行,生成UserInfo集结,那样就足以寻常访问UserExt了。别看这么些小小改造。在多表联合检查过滤字段的情景下,你会体会到尽头的妙处!

你恐怕会想到二个难点,如若自个儿再加三个完好无缺的性质汇合世哪些情形?

public partial class UserInfo  
   {  
       public string UserExt  
       {  
           get { return UserName   ":"   UserType; }  
       }  
       //新增一个完整的属性  
       public string UserExt2 { get; set; }  
   }

地点的UserExt2是大家新步入的七个特性,今后我们来施行一下查询。笔者想真正去商量过Linq的人必然了解结果了。

全球彩票注册平台 25

在Linq操作中实体中的属性必需在陈设映射时钦点。大家的数据库中本来未有UserExt2这一个字段,所以扩大Ignore标志,或调用一下:

this.Ignore(t => t.UserExt2); 

  

信任看了上面包车型大巴图样的时候,我们早就开采了EntityFramework了啊。点击“安装”就能够了。那年项目就会多出三个叫packages.config文件。那其间著录注重下设置的dll新闻。同一时间物理目录里面会多出二个文本夹packages来存在这一个dll。

深信看了地点的图纸的时候,大家已经意识了EntityFramework了呢。点击“安装”就能够了。今年项目就能多出二个叫packages.config文件。那其间著录着脚下设置的dll音讯。同有的时候候物理目录里面会多出三个文本夹packages来存在那些dll。

全球彩票注册平台 26

全球彩票注册平台 27

我们见到援用里面多出了有关EF的引用dll。那个时候大家就足以做EF的事务了。

小编们看出援引里面多出了有关EF的援用dll。这个时候大家就足以做EF的事情了。

二、新建EF上下文。EF有叁个非常重大的类。可以说是读书EF的大旨点。这些类就是DbContext。作者新建一类叫AomiContext承袭他。如下

二、新建EF上下文。EF有二个很注重的类。能够说是上学EF的大旨点。那个类就是DbContext。笔者新建一类叫AomiContext承接他。如下

public class AomiContext : DbContext
{

}
public class AomiContext : DbContext
{

}

DbContext类有多少个构造函数。作者这里讲二个常用的吗。如下

DbContext类有多少个构造函数。小编这里讲七个常用的吧。如下

 public DbContext(string nameOrConnectionString);
 public DbContext(string nameOrConnectionString);

正是个构造函数意思正是传二个连接字符串或是配置文件的连天字符的布置名。记得上一节中讲的App.config了吗。没错正是要用到他。看一下小编写的内容吗。

就是个构造函数意思正是传三个连接字符串或是配置文件的连天字符的布局名。记得上一节中讲的App.config了啊。没错便是要用到他。看一下作者写的源委吧。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="aomi" connectionString="Data Source=.;Initial Catalog=Ado;Persist Security Info=True;User ID=sa;Password=123" providerName="System.Data.SqlClient"/>
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="aomi" connectionString="Data Source=.;Initial Catalog=Ado;Persist Security Info=True;User ID=sa;Password=123" providerName="System.Data.SqlClient"/>
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

上边的connectionStrings部分是小编自身写的。别的是自动生成的。.NET自个儿有一个计划连接字符串的节点。大家正是在这一个节点上写入本身的总是就足以了。

上边的connectionStrings部分是小编本人写的。其余是自动生成的。.NET本人有三个安插连接字符串的节点。大家便是在那几个节点上写入本人的连日就能够了。

<add name="aomi" connectionString="Data Source=.;Initial Catalog=Ado;Persist Security Info=True;User ID=sa;Password=123" providerName="System.Data.SqlClient"/>
<add name="aomi" connectionString="Data Source=.;Initial Catalog=Ado;Persist Security Info=True;User ID=sa;Password=123" providerName="System.Data.SqlClient"/>

本文由全球彩票平台发布于全球彩票注册平台编程,转载请注明出处:全球彩票注册平台行使开荒之Linq和EF,NET深切实

TAG标签: 全球彩票平台
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。