linq查询数组中重复数据库的简单介绍

网站建设 14
本篇文章给大家谈谈linq查询数组中重复数据库,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 ASP.NET中的Linq怎么用? 21.1.1 准备数据源既然LINQ可以查询多种数据源和对象,这些对象可能是数组,可能是数据集,也可能是数据库,那么在使用LINQ进行数据查询时首先需要准备数据源。1.数组数组中的数据可以被LINQ查询语句查询,这样就省去了复杂的数组遍历。数组数据源示例代码如下所示。

本篇文章给大家谈谈linq查询数组中重复数据库,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

ASP.NET中的Linq怎么用?

21.1.1 准备数据源

既然LINQ可以查询多种数据源和对象,这些对象可能是数组,可能是数据集,也可能是数据库,那么在使用LINQ进行数据查询时首先需要准备数据源。

1.数组

数组中的数据可以被LINQ查询语句查询,这样就省去了复杂的数组遍历。数组数据源示例代码如下所示。

string[] str = { "学习", "学习LINQ", "好好学习", "生活很美好" };

int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

数组可以看成是一个集合,虽然数组没有集合的一些特性,但是从另一个角度上来说可以看成是一个集合。在传统的开发过程中,如果要筛选其中包含“学习”字段的某个字符串,则需要遍历整个数组。

2.SQL Server

在数据库操作中,同样可以使用LINQ进行数据库查询。LINQ以其优雅的语法和面向对象的思想能够方便的进行数据库操作,为了使用LINQ进行SQL Server数据库查询,可以创建两个表,这两个表的结构如下所示。Student(学生表):

 S_ID:学生ID。

 S_NAME:学生姓名。

 S_CLASS:学生班级。

 C_ID:所在班级的ID。

上述结构描述了一个学生表,可以使用SQL语句创建学生表,示例代码如下所示。

USE [student]

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE TABLE [dbo].[Student](

[S_ID] [int] IDENTITY(1,1) NOT NULL,

[S_NAME] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,

[S_CLASS] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,

[C_ID] [int] NULL,

CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED

(

[S_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]

为了更加详细的描述一个学生所有的基本信息,就需要创建另一个表对该学生所在的班级进行描述,班级表结构如下所示。Class(班级表):

 C_ID:班级ID。

 C_GREAD:班级所在的年级。

 C_INFOR:班级专业。

上述代码描述了一个班级的基本信息,同样可以使用SQL语句创建班级表,示例代码如下所示。

USE [student]

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE TABLE [dbo].[Class](

[C_ID] [int] IDENTITY(1,1) NOT NULL,

[C_GREAD] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,

[C_INFOR] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,

CONSTRAINT [PK_Class] PRIMARY KEY CLUSTERED

(

[C_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]

上述代码在Student数据库中创建了一个班级表,开发人员能够向数据库中添加相应的信息以准备数据源。

3.数据集

LINQ能够通过查询数据集进行数据的访问和整合;通过访问数据集,LINQ能够返回一个集合变量;通过遍历集合变量可以进行其中数据的访问和筛选。在第9章中讲到了数据集的概念,开发人员能够将数据库中的内容填充到数据集中,也可以自行创建数据集。

数据集是一个存在于内存的对象,该对象能够模拟数据库的一些基本功能,可以模拟小型的数据库系统,开发人员能够使用数据集对象在内存中创建表,以及模拟表与表之间的关系。在数据集的数据检索过程中,往往需要大量的if、else等判断才能检索相应的数据。

使用LINQ进行数据集中数据的整理和检索可以减少代码量并优化检索操作。数据集可以是开发人员自己创建的数据集也可以是现有数据库填充的数据集,这里使用上述SQL Server创建的数据库中的数据进行数据集的填充。

21.1.2 使用LINQ

在传统对象查询中,往往需要很多的if、else语句进行数组或对象的遍历,例如在数组中寻找相应的字段,实现起来往往比较复杂,而使用LINQ就简化了对象的查询。由于前面已经准备好了数据源,那么就能够分别使用LINQ语句进行数据源查询。

1.数组

在前面的章节中,已经创建了一个数组作为数据源,数组示例代码如下所示。

int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

上述代码是一个数组数据源,如果开发人员需要从其中的元素中搜索大于5的数字,传统的方法应该遍历整个数组并判断该数字是否大于5,如果大于5则输出,否则不输出,示例代码如下所示。

using System;

using System.Collections.Generic;

using System.Linq; //使用必要的命名空间

using System.Text;

namespace _21_1

{

class Program

{

static void Main(string[] args)

{

string[] str = { "学习", "学习LINQ", "好好学习", "生活很美好" }; //定义数组

int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

for (int i = 0; i inter.Length; i++) //遍历数组

{

if (inter[i] 5) //判断数组元素的值是否大于5

{

Console.WriteLine(inter[i].ToString()); //输出对象

}

}

Console.ReadKey();

}

}

}

上述代码非常简单,将数组从头开始遍历,遍历中将数组中的的值与5相比较,如果大于5就会输出该值,如果小于5就不会输出该值。虽然上述代码实现了功能的要求,但是这样编写的代码繁冗复杂,也不具有扩展性。如果使用LINQ查询语句进行查询就非常简单,示例代码如下所示。

class Program

{

static void Main(string[] args)

{

string[] str = { "学习", "学习LINQ", "好好学习", "生活很美好" }; //定义数组

int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; //定义数组

var st = from s in inter where s 5 select s; //执行LINQ查询语句

foreach (var t in st) //遍历集合元素

{

Console.WriteLine(t.ToString()); //输出数组

}

Console.ReadKey();

}

}

使用LINQ进行查询之后会返回一个IEnumerable的集合。在上一章讲过,IEnumerable是.NET框架中最基本的集合访问器,可以使用foreach语句遍历集合元素。使用LINQ查询数组更加容易被阅读,LINQ查询语句的结构和SQL语法十分类似,LINQ不仅能够查询数组,还可以通过.NET提供的编程语言进行筛选。例如str数组变量,如果要查询其中包含“学习”的字符串,对于传统的编程方法是非常冗余和繁琐的。由于LINQ是.NET编程语言中的一部分,开发人员就能通过编程语言进行筛选,LINQ查询语句示例代码如下所示。

var st = from s in str where s.Contains("学习") select s;

2.使用SQL Server

在传统的数据库开发中,如果需要筛选某个数据库中的数据,可以通过SQL语句进行筛选。在ADO.NET中,首先需要从数据库中查询数据,查询后就必须将数据填充到数据集中,然后在数据集中进行数据遍历,示例代码如下所示。

try

{

SqlConnection

con = new SqlConnection("server='(local)';database='student';uid='sa';pwd='sa'"); //创建连接

con.Open(); //打开连接

string strsql = "select * from student,class where student.c_id=class.c_id"; //SQL语句

SqlDataAdapter da = new SqlDataAdapter(strsql, con); //创建适配器

DataSet ds = new DataSet(); //创建数据集

int j = da.Fill(ds, "mytable"); //填充数据集

for (int i = 0; i j; i++) //遍历集合

{

Console.WriteLine(ds.Tables["mytable"].Rows[i]["S_NAME"].ToString()); //输出对象

}

}

catch

{

Console.WriteLine("数据库连接错误"); //抛出异常

}

上述代码进行数据库的访问和查询。在上述代码中,首先需要创建一个连接对象进行数据库连接,然后再打开连接,打开连接之后就要编写SELECT语句进行数据库查询并填充到DataSet数据集中,并在DataSet数据集中遍历相应的表和列进行数据筛选。如果要查询C_ID为1的学生的所有姓名,有三个办法,这三个办法分别是:

 修改SQL语句。

 在循环内进行判断。

 使用LINQ进行查询。

修改SQL语句是最方便的方法,直接在SELECT语句中添加查询条件WHERE C-ID=1就能够实现,但是这个方法扩展性非常的低,如果有其他需求则就需要修改SQL语句,也有可能造成其余代码填充数据集后数据集内容不同步。

在循环内进行判断也是一种方法,但是这个方法当循环增加时会造成额外的性能消耗,并且当需要扩展时,还需要修改循环代码。最方便的就是使用LINQ进行查询,在Visual Studio 2008中提供了LINQ to SQL类文件用于将现有的数据抽象成对象,这样就符合了面向对象的原则,同时也能够减少代码,提升扩展性。创建一个LINQ to SQL类文件,直接将服务资源管理器中的相应表拖放到LINQ to SQL类文件可视化窗口中即可,如图21-1所示。

图21-1 创建LINQ to SQL文件

创建了LINQ to SQL类文件后,就可以直接使用LINQ to SQL类文件提供的类进行查询,示例代码如下所示。

linqtosqlDataContext lq = new linqtosqlDataContext();

var mylq = from l in lq.Student from cl in lq.Class where l.C_ID==cl.C_ID select l; //执行查询

foreach (var result in mylq) //遍历集合

{

Console.WriteLine(result.S_NAME.ToString()); //输出对象

}

上述代码只用了很短的代码就能够实现数据库中数据的查询和遍历,并且从可读性上来说也很容易理解,因为LINQ查询语句的语法基本与SQL语法相同,只要有一定的SQL语句基础就能够非常容易的编写LINQ查询语句。

3.数据集

LINQ同样对数据集支持查询和筛选操作。其实数据集也是集合的表现形式,数据集除了能够填充数据库中的内容以外,开发人员还能够通过对数据集的操作向数据集中添加数据和修改数据。前面的章节中已经讲到,数据集可以看作是内存中的数据库。数据集能够模拟基本的数据库,包括表、关系等。这里就将SQL Server中的数据填充到数据集即可,示例代码如下所示。

try

{

SqlConnection

con = new SqlConnection("server='(local)';database='student';uid='sa';pwd='sa'"); //创建连接

con.Open(); //打开连接

string strsql = "select * from student,class where student.c_id=class.c_id"; //执行SQL

SqlDataAdapter da = new SqlDataAdapter(strsql, con); //创建适配器

DataSet ds = new DataSet(); //创建数据集

da.Fill(ds, "mytable"); //填充数据集

DataTable tables = ds.Tables["mytable"]; //创建表

var dslq = from d in tables.AsEnumerable() select d; //执行LINQ语句

foreach (var res in dslq)

{

Console.WriteLine(res.Fieldstring("S_NAME").ToString()); //输出对象

}

}

catch

{

Console.WriteLine("数据库连接错误");

}

上述代码使用LINQ针对数据集中的数据进行筛选和整理,同样能够以一种面向对象的思想进行数据集中数据的筛选。在使用LINQ进行数据集操作时,LINQ不能直接从数据集对象中查询,因为数据集对象不支持LINQ查询,所以需要使用AsEnumerable方法返回一个泛型的对象以支持LINQ的查询操作,示例代码如下所示。

var dslq = from d in tables.AsEnumerable() select d; //使用AsEnumerable

上述代码使用AsEnumerable方法就可以让数据集中的表对象能够支持LINQ查询。

21.1.3 执行LINQ查询

从上一节可以看出LINQ在编程过程中极大的方便了开发人员对于业务逻辑的处理代码的编写,在传统的编程方法中复杂、冗余、难以实现的方法在LINQ中都能很好的解决。LINQ不仅能够像SQL语句一样编写查询表达式,LINQ最大的优点也包括LINQ作为编程语言的一部分,可以使用编程语言提供的特性进行LINQ条件语句的编写,这就弥补了SQL语句中的一些不足。在前面的章节中将一些复杂的查询和判断的代码简化成LINQ应用后,就能够执行应用程序判断LINQ是否查询和筛选出了所需要的值。

1.数组

在数组数据源中,开发人员希望能够筛选出大于5的元素。开发人员将传统的代码修改成LINQ代码并通过LINQ查询语句进行筛选,示例代码如下所示。

var st = from s in inter where s 5 select s; //执行LINQ查询

上述代码将查询在inter数组中的所有元素并返回其中元素的值大于5的元素的集合,运行后如图21-2所示。

图21-2 遍历数组

LINQ执行了条件语句并返回了元素的值大于5的元素。LINQ语句能够方便的扩展,当有不同的需求时,可以修改条件语句进行逻辑判断,例如可以筛选一个平方数为偶数的数组元素,直接修改条件即可,LINQ查询语句如下所示。

var st = from s in inter where (s*s)%2==0 select s; //执行LINQ查询

上述代码通过条件(s*s)%2==0将数组元素进行筛选,选择平方数为偶数的数组元素的集合,运行后如图21-3所示。

图21-3 更改筛选条件

2.使用SQL Server

在LINQ to SQL类文件中,LINQ to SQL类文件已经将数据库的模型封装成一个对象,开发人员能够通过面向对象的思想访问和整合数据库。LINQ to SQL也对SQL做了补充,使用LINQ to SQL类文件能够执行更强大的筛选,LINQ查询语句代码如下所示。

var mylq = from l in lq.Student from cl in lq.Class where l.C_ID==cl.C_ID select l; //执行LINQ查询

上述代码从Student表和Class表中筛选了C_ID相等的学生信息,这很容易在SQL语句中实现。LINQ作为编程语言的一部分,可以使用更多的编程方法实现不同的筛选需求,例如筛选名称中包含“郭”字的学生的名称在传统的SQL语句中就很难通过一条语句实现,而在LINQ中就能够实现,示例代码如下所示。

var mylq = from l in lq.Student from cl in lq.Class where l.C_ID==cl.C_ID where

l.S_NAME.Contains("郭") select l; //执行LINQ条件查询

上述代码使用了Contains方法判断一个字符串中是否包含某个字符或字符串,这样不仅方便阅读,也简化了查询操作,运行后如图21-4和图21-5所示。

图21-4 简单查询 图21-5 条件查询

LINQ返回了符合条件的元素的集合,并实现了筛选操作。LINQ不仅作为编程语言的一部分,简化了开发人员的开发操作,从另一方面讲,LINQ也补充了在SQL中难以通过几条语句实现的功能的实现。从上面的LINQ查询代码可以看出,就算是不同的对象、不同的数据源,其LINQ基本的查询语法都非常相似,并且LINQ还能够支持编程语言具有的特性从而弥补SQL语句的不足。在数据集的查询中,其查询语句也可以直接使用而无需大面积修改代码,这样代码就具有了更高的维护性和可读性。

C#中LINQ查询语句,在一个数组里面通过一个条件查询另外一个数据出来,如下:

var data=from l in books group l by l.fenlei into bb select new {FenLeiList= bb.fenlei }

得到分类集合,填充到界面上的选择框之类的控件在其事件里加入

var data=from l in books where l.fenlei==控件.text select l

得到所选分类的书的集合

谁有关于linq的资料,急需

在达人博客上看到的:是个系列,一共三篇,你去百度搜搜“LINQ to SQL、NHibernate比较”就能找到了。我给你转第一篇。

LINQ to SQL、NHibernate比较(一)-- LINQ和NHibernate初体验

1 引言

研发与数据库打交道的系统的时候,最过于繁琐的莫过于没有编程快感的使用ADO.NET对后台数据库进行操作,因为所有的数据库连接、读取、操作千篇一律,编程成为了体力活。

虽然我们可以设计自己的类作为数据库访问的持久层,但是每一个类都必须有不相同的SQL语句,这样对于设计统一的数据库读写类造成了很大的困难。

开发人员在这种情况下必须包办窗体设计、方法设计、数据库读写设计的过程,这样加大了开发人员的负担也使得项目的维护和后期开发变得难以进行。

2 .NET下的ORM解决方案

2.1 LINQ

2.1.1 LINQ简介

作为微软开发的查询方案,LINQ 提供了一条更常规的途径即给 .Net Framework 添加一些可以应用于所有信息源( all sources of information )的具有多种用途( general-purpose )的语法查询特性( query facilities ),这是比向开发语言和运行时( runtime )添加一些关系数据( relational )特性或者类似 XML 特性( XML-specific )更好的方式。这些语法特性就叫做 .NET Language Integrated Query (LINQ) 。

如果觉得上面的解释有点抽象,那么可以这样理解,LINQ其实就是提供了一套查询功能,可以实现任何数据源的查询,此处数据源不单指数据库或者XML文件,而是任何集合或者实体,比如我们接触各种编程语言都需要用到的数组,现在不用遍历数组元素来寻找需要的项,LINQ可以实现这方面的查询。

LINQ查询数组:

图2.1 LINQ查询数组

上面是最简单的LINQ实现对数组的查询,泛型类型var在LINQ查询中提供了强大的委托类型支持,不管查询集合中项的类型(无论是int,char还是string或者类),我们只用一个var就可以保存LINQ查询到的结果。程序结果如下:

图2.2 LINQ查询数组程序结果

是不是很方便,LINQ的应用远远不这些,通过不同的映射方案,我们可以实现对数据库(LINQ To SQL),对XML文件(LINQ To XML)的访问。

2.1.2 LINQ简介

表2.1 LINQ的操作符

操作符

说明

聚合

Aggregate

对序列执行一个自定义方法

Average

计算数值序列的平均值

Count

返回序列中的项目数(整数)

LongCount

返回序列中的项目数(长型)

Min

查找数字序列中的最小数

Max

查找数字序列中的最大数

Sum

汇总序列中的数字

连接

Concat

将两个序列连成一个序列

转换

Cast

将序列中的元素转换成指定类型

OfType

筛选序列中指定类型的元素

ToArray

从序列返回一个数组

ToDictionary

从序列返回一个字典

ToList

从序列返回一个列表

ToLookup

从序列返回一个查询

ToSequence

返回一个 IEnumerable 序列

元素

DefaultIfEmpty

为空序列创建默认元素

ElementAt

返回序列中指定索引的元素

ElementAtOrDefault

返回序列中指定索引的元素,或者如果索引超出范围,则返回默认值

First

返回序列中的第一个元素

FirstOrDefault

返回序列中的第一个元素,或者如果未找到元素,则返回默认值

Last

返回序列中的最后一个元素

LastOrDefault

返回序列中的最后一个元素,或者如果未找到元素,则返回默认值

Single

返回序列中的单个元素

SingleOrDefault

返回序列中的单个元素,或者如果未找到元素,则返回默认值

相等

SequenceEqual

比较两个序列看其是否相等

生成

Empty

生成一个空序列

Range

生成一个指定范围的序列

Repeat

通过将某个项目重复指定次数来生成一个序列

分组

GroupBy

按指定分组方法对序列中的项目进行分组

联接

GroupJoin

通过归组将两个序列联接在一起

Join

将两个序列从内部联接起来

排序

OrderBy

以升序按值排列序列

OrderByDescending

以降序按值排列序列

ThenBy

升序排列已排序的序列

ThenByDescending

降序排列已排序的序列

Reverse

颠倒序列中项目的顺序

分区

Skip

返回跳过指定数目项目的序列

SkipWhile

返回跳过不满足表达式项目的序列

Take

返回具有指定数目项目的序列

TakeWhile

返回具有满足表达式项目的序列

投影

Select

创建部分序列的投影

SelectMany

创建部分序列的一对多投影

限定符

All

确定序列中的所有项目是否满足某个条件

Any

确定序列中是否有任何项目满足条件

Contains

确定序列是否包含指定项目

限制

Where

筛选序列中的项目

设置

Distinct

返回无重复项目的序列

Except

返回代表两个序列差集的序列

Intersect

返回代表两个序列交集的序列

Union

返回代表两个序列交集的序列

Lambda 表达式

许多标准查询操作符在对序列执行运算时都使用 Func 委托来处理单个元素。Lambda 表达式可与标准查询操作符结合使用以代表委托。lambda 表达式是创建委托实现的简略表达形式,并可用于匿名委托适用的所有场合。C# 和 Visual Basic® .NET 均支持 Lambda 表达式。但是,必须注意:由于 Visual Basic .NET 尚不支持匿名方法,Lambda 表达式可能仅包含一个语句。

上例中的的程序等同于下面

图2.3 Lambda表达式的使用

2.2 NHibernate

说到NHibernate,就不得不提Hibernate,原因很简单,Hibernate顾名思义就是Hibernate的.NET版本。

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

NHibernate作为Hibernate的.NET应用于Hibernate的实现完全相同,学习NHibernate完全可以直接学习Hibernate的资料。

事实上,虽然在Java数据库映射领域Hibernate是使用最为广泛的方案,但是在.NET中由于LINQ等映射方案(包括微软下一代重量级的Entity Framework)的使用,NHibernate冷了许多。

NHibernate需要配置数据库配置文件和类/表映射配置文件,所以使用NHibernate需要懂得XML文件的基础知识,并且需要掌握比较复杂的XML文件配置节和相应的配置命令。

2.2.1 数据库配置文件

NHibernate官方提供了配置文件的模板和实例可供我们参考。

图2.4 NHibernate官方数据库配置文件模板(对应了不同的数据库)

上图为数据库配置文件。通常以“cfg.xml”作为后缀,一个示例的文件内容如下

图2.5 数据库配置文件示例

下面是一些在运行时可以改变NHibernate行为的其他配置。所有这些都是可选的,也有合理的默认值。

表2.2 NHibernate 配置属性

属性名

用途

hibernate.dialect

NHibernate方言(Dialect)的类名 - 可以让NHibernate使用某些特定的数据库平台的特性

例如: full.classname.of.Dialect(如果方言创建在NHibernate中), 或者full.classname.of.Dialect, assembly (如果使用一个自定义的方言的实现,它不属于NHibernate)。

hibernate.default_schema

在生成的SQL中,scheml/tablespace的全限定名.

例如: SCHEMA_NAME

hibernate.prepare_sql

是否准备sql语句

例如: true | false

hibernate.session_factory_name

SessionFactory被创建后将自动绑定这个名称.

例如: some.name

hibernate.use_outer_join

允许使用外连接抓取。

例如:true | false

hibernate.cache.provider_class

指定一个自定义的CacheProvider缓存提供者的类名

例如: full.classname.of.CacheProvider(如果ICacheProvider创建在NHibernate中), 或full.classname.of.CacheProvider, assembly(如果使用一个自定义的ICacheProvider,它不属于NHibernate)。

hibernate.query.substitutions

把NHibernate查询中的一些短语替换为SQL短语(比如说短语可能是函数或者字符)。

例如: hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC

2.2.2 实体映射配置文件

NHibernate官方开源包中提供了实体映射配置文件的实例可供我们参考。

图2.6 NHibernate开源包中提供的实体映射配置文件

与数据库配置文件一样实体映射配置文件也是XML文件(XML果然是很强大啊,微软下一代应用程序开发技术WPF就是使用XML文件将C/S和B/S长期分居的二人统一到一个屋檐下),所不同的是实体映射配置文件后缀是“hbm.xml”。

图2.7 实体映射配置文件

实体映射配置文件所要配置的信息一般为

Ø Schema

所有的XML映射都需要使用nhibernate-mapping-2.0 schema。目前的schema可以在NHibernate的资源路径或者是NHibernate.dll的嵌入资源(Embedded Resource)中找到。NHibernate总是会优先使用嵌入在资源中的schema文件。

Ø hibernate-mapping

(1)

schema (可选): 数据库schema名称.

(2)

default-cascade (可选 - 默认为 none): 默认的级联风格.

(3)

auto-import (可选 - 默认为 true): 指定是否我们可以在查询语言中使用非全限定的类名(仅限于本映射文件中的类)。

(4)

default-access (可选 - 默认为 property): NHibernate访问属性值时的策略。

(5)

assembly (可选): 指定一个程序集,如果在映射文档中没有指定程序集,就使用这个程序集。

(6)

namespace (可选): 指定一个命名空间前缀,如果在映射文档中没有指定全限定名,就使用这个命名空间名。

Ø class (1)

name: 持久化类(或者接口)的全限定名。

(2)

table: 对应的数据库表名。

(3)

discriminator-value (可选 - 默认和类名一样): 一个用于区分不同的子类的值,在多态行为时使用。

(4)

mutable (可选, 默认为 true): 表明该类的实例可变(不可变)。

(5)

schema (可选): 覆盖在根hibernate-mapping 元素中指定的schema名字。

(6)

proxy (可选): 指定一个接口,在延迟装载时作为代理使用。你可以在这里使用该类自己的名字。

(7)

dynamic-update (可选, 默认为 false): 指定用于UPDATE 的SQL将会在运行时动态生成,并且只更新那些改变过的字段。

(8)

dynamic-insert (可选, 默认为 false): 指定用于INSERT的 SQL 将会在运行时动态生成,并且只包含那些非空值字段。

(9)

polymorphism (可选, 默认为 implicit(隐式)): 界定是隐式还是显式的使用查询多态。

(10)

where (可选) 指定一个附加的SQL WHERE 条件,在抓取这个类的对象时会一直增加这个条件。

(11)

persister (可选): 指定一个定制的 IClassPersister.

(12)

lazy(可选):假若设置 lazy="true",就是设置这个类自己的名字作为proxy接口的一种等价快捷形式。

Ø id (1)

name (可选): 标识属性的名字。

(2)

type (可选): 标识NHibernate类型的名字。

(3)

column (可选 - 默认为属性名): 主键字段的名字。

(4)

unsaved-value (可选 - 默认为 null): 一个特定的标识属性值,用来标志该实例是刚刚创建的,尚未保存。这可以把这种实例和从以前的session中装载过(可能又做过修改--译者注)但未再次持久化的实例区分开来。

(5)

access (可选 - 默认为 property): NHibernate用来访问属性值的策略。

除此之外我们可以通过其他途径深入了解配置方面的知识,一个NHibernate项目,配置文件的错误往往导致错误的结果甚至使得程序无法运行。

3 小结

本文初步介绍了LINQ to SQL和NHibernate,其中介绍NHibernate使用了较多的篇幅,因为相对LINQ to SQL而言NHibernate的使用入门门槛较高,配置较为复杂。关于LINQ to SQL、NHibernate优缺点将在后面文章中讨论,不过从此处其实已经得出一点,那就是LINQ to SQL比NHibernate更加容易上手,节省了人员培训的开销。

c#中怎么找出一个数组里重复的数

            int[] iArr = { 1, 2, 3, 3, 5, 10, 15, 20 };

            Dictionaryint, int myDic = new Dictionaryint, int();

            for (int i = 0; i  iArr.Length; i++)

            {

                if (myDic.Keys.Contains(iArr[i]))

                {

                    myDic[iArr[i]]++;

                }

                else

                {

                    myDic[iArr[i]] = 1;

                }

            }

            int[] numArr = myDic.Where(t = t.Value  1).ToDictionary(t = t.Key, t = t.Value).Keys.ToArray();

肯定有更合适的方法,这里就随便写一下。后面有用到linq,大概意思表达出来了,题主如果没有思路可以在这个基础上修改。

C#的lINQ怎么用干什么用的?

1.LINQ:Language Integrated Query 语言集成查询。

2.LINQ通过对象的方式对数据库进行描述。

3.LINQ是一种能够快速对大部分数据源进行访问和数据整合的一种技术,使用相同的基本查询表达式模式类查询和转换SQL数据库、ADO.NET数据集、XML文档和流已经.NET集合中的数据。

4.使用方法:

LINQ to Objects

LINQ to DataSet

LINQ to SQL

LINQ to Entities

LINQ to XML

c# linq Distinct 过滤重复项怎么做啊

text类型就别做DISTINCT了,效率会让你吐血。

实在想做的话,尝试newslist = newslist.OrderBy(x=x.nID).ToList().Distinct();

将数据加载入内存,用CLR来做DISTINCT

linq查询数组中重复数据库的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、linq查询数组中重复数据库的信息别忘了在本站进行查找喔。

linq查询数组中重复数据库
扫码二维码