LINQ入门教程
- 格式:doc
- 大小:202.00 KB
- 文档页数:14
LINQ教程之LINQ操作语法LINQ查询时有两种语法可供选择:查询表达式语法(Query Expression)和⽅法语法(Fluent Syntax)。
⼀、查询表达式语法查询表达式语法是⼀种更接近SQL语法的查询⽅式。
LINQ查询表达式语法如下:from<range variable> in <IEnumerable<T> or IQueryable<T> Collection><Standard Query Operators> <lambda expression><select or groupBy operator> <result formation>LINQ查询表达式约束LINQ查询表达式必须以from⼦句开头,以select或group⼦句介绍关键字功能from....in...指定要查询的数据源以及范围变量,多个from⼦句则表⽰从多个数据源查找数据。
注意:C#编译器会把“复合from⼦句”的查询表达式转换为SelectMany()扩展⽅法。
join…in…on…equals…指定多个数据源的关联⽅式let引⼊⽤于存储查询表达式中⼦表达式结果的范围变量。
通常能达到层次感会更好,使代码更易于阅读。
orderby、descending 指定元素的排序字段和排序⽅式。
当有多个排序字段时,由字段顺序确定主次关系,可指定升序和降序两种排序⽅式where指定元素的筛选条件。
多个where⼦句则表⽰了并列条件,必须全部都满⾜才能⼊选。
每个where⼦句可以使⽤谓词&&、||连接多个条件表达式。
group指定元素的分组字段。
select指定查询要返回的⽬标数据,可以指定任何类型,甚⾄是匿名类型。
(⽬前通常被指定为匿名类型)into 提供⼀个临时的标识符。
该标识可以引⽤join、group和select⼦句的结果。
C#LINQ语法详解1.简单的linq语法//1var ss = from r in db.Am_recProSchemeselect r;//2var ss1 = db.Am_recProScheme;//3string sssql = "select * from Am_recProScheme";2.带where的查询//1var ss = from r in db.Am_recProSchemewhere r.rpId > 10select r;//2var ss1 = db.Am_recProScheme.Where(p => p.rpId > 10);//3string sssql = "select * from Am_recProScheme where rpid>10";3.简单的函数计算(count,min,max,sum)//1////获取最⼤的rpId//var ss = (from r in db.Am_recProScheme// select r).Max(p => p.rpId);////获取最⼩的rpId//var ss = (from r in db.Am_recProScheme// select r).Min(p => p.rpId);//获取结果集的总数//var ss = (from r in db.Am_recProScheme// select r).Count();//获取rpId的和var ss = (from r in db.Am_recProSchemeselect r).Sum(p => p.rpId);//2//var ss1 = db.Am_recProScheme.Max(p=>p.rpId);//var ss1 = db.Am_recProScheme.Min(p => p.rpId);//var ss1 = db.Am_recProScheme.Count() ;var ss1 = db.Am_recProScheme.Sum(p => p.rpId);Response.Write(ss);//3string sssql = "select max(rpId) from Am_recProScheme";sssql = "select min(rpId) from Am_recProScheme";sssql = "select count(1) from Am_recProScheme";sssql = "select sum(rpId) from Am_recProScheme";4.排序order by desc/ascvar ss = from r in db.Am_recProSchemewhere r.rpId > 10orderby r.rpId descending //倒序// orderby r.rpId ascending //正序select r;//正序var ss1 = db.Am_recProScheme.OrderBy(p => p.rpId).Where(p => p.rpId > 10).ToList();//倒序var ss2 = db.Am_recProScheme.OrderByDescending(p => p.rpId).Where(p => p.rpId > 10).ToList(); string sssql = "select * from Am_recProScheme where rpid>10 order by rpId [desc|asc]";5.top(1)//如果取最后⼀个可以按倒叙排列再取值var ss = (from r in db.Am_recProSchemeselect r).FirstOrDefault();//()linq to ef 好像不⽀持 Last()var ss1 = db.Am_recProScheme.FirstOrDefault();//var ss1 = db.Am_recProScheme.First();string sssql = "select top(1) * from Am_recProScheme";6.跳过前⾯多少条数据取余下的数据//1var ss = (from r in db.Am_recProSchemeorderby r.rpId descendingselect r).Skip(10); //跳过前10条数据,取10条之后的所有数据//2var ss1 = db.Am_recProScheme.OrderByDescending(p => p.rpId).Skip(10).ToList();//3string sssql = "select * from (select ROW_NUMBER()over(order by rpId desc) as rowNum, * from [Am_recProScheme]) as t where rowNum>10";7.分页数据查询//1var ss = (from r in db.Am_recProSchemewhere r.rpId > 10orderby r.rpId descendingselect r).Skip(10).Take(10); //取第11条到第20条数据//2 Take(10): 数据从开始获取,获取指定数量(10)的连续数据var ss1 = db.Am_recProScheme.OrderByDescending(p => p.rpId).Where(p => p.rpId > 10).Skip(10).Take(10).ToList();//3string sssql = "select * from (select ROW_NUMBER()over(order by rpId desc) as rowNum, * from [Am_recProScheme]) as t where rowNum>10 and rowNum<=20";8.包含,类似like '%%'//1var ss = from r in db.Am_recProSchemewhere r.SortsText.Contains("张")select r;//2var ss1 = db.Am_recProScheme.Where(p => p.SortsText.Contains("张")).ToList();//3string sssql = "select * from Am_recProScheme where SortsText like '%张%'";9.分组group by//1var ss = from r in db.Am_recProSchemeorderby r.rpId descendinggroup r by r.recType into nselect new{n.Key, //这个Key是recTyperpId = n.Sum(r => r.rpId), //组内rpId之和MaxRpId = n.Max(r => r.rpId),//组内最⼤rpIdMinRpId = n.Min(r => r.rpId), //组内最⼩rpId};foreach (var t in ss){Response.Write(t.Key + "--" + t.rpId + "--" + t.MaxRpId + "--" + t.MinRpId);}//2var ss1 = from r in db.Am_recProSchemeorderby r.rpId descendinggroup r by r.recType into nselect n;foreach (var t in ss1){Response.Write(t.Key + "--" + t.Min(p => p.rpId));}//3var ss2 = db.Am_recProScheme.GroupBy(p => p.recType);foreach (var t in ss2){Response.Write(t.Key + "--" + t.Min(p => p.rpId));}//4string sssql = "select recType,min(rpId),max(rpId),sum(rpId) from Am_recProScheme group by recType";10.sql中的In//Linqvar ss = from p in db.Am_recProSchemewhere (new int?[] { 24, 25,26 }).Contains(p.rpId)select p;foreach (var p in ss){Response.Write(p.Sorts);}//SQLstring st = "select * from Am_recProScheme where rpId in(24,25,26)";11.内连接 INNER JOIN//Linqvar ss = from r in db.Am_recProSchemejoin w in db.Am_Test_Result on r.rpId equals w.rsIdorderby r.rpId descendingselect r;//Lambdavar ss1 = db.Am_recProScheme.Join(db.Am_Test_Result, p => p.rpId, r => r.rsId, (p, r) => p).OrderByDescending(p => p.rpId).ToList(); //SQLstring sssql = "select r.* from [Am_recProScheme] as r inner join [dbo].[Am_Test_Result] as t on r.[rpId] = t.[rsId] order by r.[rpId] desc";12.左连接 LEFT JOIN//两个DataTable关联,查找只在第⼀个表中的数据static void Main(string[] args){DataTable dt1 = new DataTable("Ta");DataTable dt2 = new DataTable("Tb");dt1.Columns.Add("ID", typeof(int));dt1.Columns.Add("Name", typeof(string));dt1.Rows.Add(1, "⼩明");dt1.Rows.Add(2, "⼩红");dt1.Rows.Add(3, "⼩⿊");dt2.Columns.Add("ID", typeof(int));dt2.Columns.Add("Name", typeof(string));dt2.Rows.Add(1, "⼩黄");dt2.Rows.Add(2, "⼩红");dt2.Rows.Add(3, "⼩强");//⽅法⼀:Linq//var query = from q1 in dt1.AsEnumerable()// join q2 in dt2.AsEnumerable()// on q1.Field<string>("Name") equals q2.Field<string>("Name") into tmp// from q3 in tmp.DefaultIfEmpty()// where q3 == null// select new// {// ID = q1.Field<int>("ID"),// Name = q1.Field<string>("Name")// };//⽅法⼆:Lambdavar query = dt1.AsEnumerable().GroupJoin(dt2.AsEnumerable(),x => x.Field<string>("Name"),y => y.Field<string>("Name"),(x, y) => y.DefaultIfEmpty(). Where(w => w == null).Select(z => new { ID = x.Field<int>("ID"), Name = x.Field<string>("Name") })).SelectMany(x => x);foreach (var item in query){Console.WriteLine($"ID={item.ID} Name={}");}Console.Read();}实例⽤法://数据库 + ⾃定义名称 =new 数据库mydbDataContext con = new mydbDataContext();//模糊查询表达式中⽤.Containscon.car.Where(r=>.Contains(TextBox1.Text.Trim())).ToList();//开头查⽤.StartWithcon.car.Where(r => .StartsWith(TextBox1.Text)).ToList();//结尾查⽤.EndWithcon.car.Where(r => .EndsWith(TextBox1.Text)).ToList();//最⼤值con.car.Max(r => r.price * r.oil).ToString();//最⼩值con.car.Min(r => r.price).ToString();//求和con.car.Sum(r => r.price).ToString();//平均值con.car.Average(r => r.price).ToString();//升序:con.car.OrderBy(r => r.price).ToList();//降序:con.car.OrderByDescending(r => r.price).ToList();//上⼀页,下⼀页,组合查询:int PageCount = 5;//每页显⽰条数//上⼀页,PageCount_Label.Text为当前页码int pageNum = Convert.ToInt32(PageCount_Label.Text) - 1;Repeater1.DataSource = con.car.Skip((pageNum - 1) * PageCount).Take(PageCount); Repeater1.DataBind();PageCount_Label.Text = pageNum.ToString();//下⼀页int pageNum = Convert.ToInt32(PageCount_Label.Text) + 1;Repeater1.DataSource = con.car.Skip((pageNum - 1) * PageCount).Take(PageCount); Repeater1.DataBind();PageCount_Label.Text = pageNum.ToString();//组合查询的点击事件List<car> list = con.car.ToList();if (TextBox2.Text != ""){List<car> list1 = con.car.Where(r => .Contains(TextBox2.Text)).ToList();list = list.Intersect(list1).ToList();}if (TextBox3.Text != ""){List<car> list1 = con.car.Where(r => r.oil == Convert.ToDecimal(TextBox3.Text)).ToList(); list = list.Intersect(list1).ToList();}if (TextBox4.Text != ""){List<car> list1 = con.car.Where(r => r.powers == Convert.ToInt32(TextBox4.Text)).ToList(); list = list.Intersect(list1).ToList();}Repeater1.DataSource = list;Repeater1.DataBind();。
C#基础知识系列-7Linq详解前言在上一篇中简单介绍了Linq的入门级用法,这一篇尝试讲解一些更加深入的使用方法,与前一篇的结构不一样的地方是,这一篇我会先介绍Linq里的支持方法,然后以实际需求为引导,分别以方法链的形式和类SQL的形式写出来。
前置概念介绍1.Predicate<T> 谓词、断言,等价于Func<T,bool> 即返回bool的表达式2.Expression<TDelegate> 表达式树,这个类很关键,但是在这里会细说,我们会讲它的一个特殊的泛型类型:Expression<Func<T,bool>> 这个在某些数据源的查询中十分重要,它代表lambda表达式中一种特殊的表达式,即没有大括号和return 关键字的那种。
我们先准备两个类:1.Student/学生类:/// <summary>/// 学生/// </summary>public class Student{/// <summary>/// 学号/// </summary>public int StudentId { get; set; }/// <summary>/// 姓名/// </summary>public string Name { get; set; }/// <summary>/// 班级/// </summary>public string Class { get; set; }/// <summary>/// 年龄/// </summary>public int Age { get; set; }}2.Subject/科目类:3./// <summary>4./// 科目5./// </summary>6.public class Subject7.{8./// <summary>9./// 名称10./// </summary>11.public string Name { get; set; }12./// <summary>13./// 年级14./// </summary>15.public string Grade { get; set; }16./// <summary>17./// 学号18./// </summary>19.public int StudentId { get; set; }20./// <summary>21./// 成绩22./// </summary>23.public int Score { get; set; }24.}Subject 和Student通过学号字段一一关联,实际工作中数据表有可能会设计成这。
Linq基础1.1 LINQ简介LINQ(Language Integrated Query)是C#3.0语言新增的一个扩展,可以处理非常大的对象集合,这一般需要选择集合的一个子集来完成执行程序的任务。
Linq提供了很多扩展方法便于集合的排序、组合和计算查询结果的统计数据。
VS2008带有3个内置的LIN Q变体:Linq to Objects Linq to SQL Linq to XML,它们为不同的数据提供了查询方案:Linq to Objects:为任意类型的C#内存对象提供查询,如数组、列表和其它集合类型。
Linq to SQL:为使用标准SQL数据库查询语言的关系数据库提供查询,如SQL Se rver、Oracle等数据库。
Linq to XML:提供XML文档的创建和处理功能。
1.2 第一LINQ查询下面我们使用Linq实现一个对数组的查找功能,代码如下:示例1class Program{static void Main(string[] args){string[] names = { "alonso", "zheng", "smith", "jon es", "smythe", "small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "singh" };var result = from n in names where n.StartsWith("s") select n;Console.WriteLine("以s开头的名字为:");foreach (var item in result){Console.WriteLine(item);}}}示例说明:命名空间:System.Linq;用var关键字声明结果变量;var声明的变量不用指定类型,编译器会自动根据结果推断出该类型。
跟我一起LINQ起来——之一(初识LINQ)1.什么是LINQ语言集成查询,提供适用于多种数据源(数据库、XML、内存对象)的通用查询。
2.如何创建LINQ项目1.必须.NET Framework3.5以上版本2.使用LINQ to XML必须添加对System.Xml.Linq 的引用3.使用LINQ to SQL必须添加对System.Data.Linq 的引用4.使用LINQ to Dataset必须为LINQ to DataSet 功能添加对System.Data.DataSetExtensions.dll 的引用3.使用LINQ 的优点1.熟悉的查询编写语法。
2.针对语法错误和类型安全的编译时检查。
3.改进的调试器支持。
4.IntelliSense 支持。
5.直接处理XML 元素的功能,而不是像W3C DOM 那样需要创建容器XML 文档。
6.强大的内存中XML 文档修改功能,比XPath 或XQuery 更容易使用。
7.强大的筛选、排序和分组功能。
8.用于跨多种数据源和数据格式处理数据的一致模型。
友情提示:以上所述有点需要在大量的程序中去体会。
本例中所有的案例代码均使用VS2008+SqlServer2005编写4.小试牛刀:基本查询案例1.查询普通int数组public static void IntQuery() {int[] array = new int[] { 1,2,3,4,5,6,7,8};//查询所有信息var arr = from n in array select n;foreach (var item in arr) {Console.WriteLine(item);}//查询所有偶数IEnumerable<int> arr1 = from n in array where n%2 == 0 select n;foreach (int item in arr1) {Console.WriteLine(item);}}案例2.查询string 数组案例3.查询 List<String> 集合//1.****查询普通字符串集合,类似于string 数组****public static void StringQuery() { //弱类型数组:.NET Framework 3.5新特性var countries = new string []{ "China","Americ","Canada","France"}; Console .WriteLine("*******查询China********"); var china = from country in countries where country == "China" select country; Console .WriteLine(china.First<string >()); Console .WriteLine("*******查询C 打头的元素********"); var likeC = from country in countries where country.StartsWith("C") select country; foreach (var item in likeC) { Console .WriteLine(item); } } public static void ListQuery() { List <string > countries = new List <string >(); countries.AddRange(new string [] { "China", "Americ", "Canada", "France" }); Console .WriteLine("*******查询C 打头的元素********"); var likeC = from country in countries where country.StartsWith("C") select country; //显示查询结果 foreach (var item in likeC) { Console .WriteLine(item); } }案例4.查询List<Student> 集合//////Student 实体类具有(Name、Age)属性///public static void ListQuery2() {List<Student> list = new List<Student>();list.AddRange(new Student[]{new Student("阿牛",23),new Student("阿猫",23),new Student("老朱",53)});Console.WriteLine("*******查询'啊'打头的Student信息********");IEnumerable<Student> stus = from stu in listwhere .StartsWith("阿")select stu;foreach (Student stu in stus) {Console.WriteLine(+"\t"+stu.Age);}}总结:通过以上四个案例,可以看出使用LINQ可以方便的从数组和List(也包括Dictionary)集合中查询得到想要的元素,可以大大的简化查找元素的过程。
LINQ中文教程一、LINQ概述LINQ是一种查询技术,它允许开发人员使用统一语法进行查询,无论是对于集合、数据库、XML还是其他数据源。
它支持对数据源进行过滤、排序、分组和投影等操作。
LINQ主要有以下几个方面的特点:1.统一的查询语法:LINQ提供了一种统一的查询语法,无论是对于集合还是其他数据源,开发人员都可以使用相同的语法进行查询。
2.编译时类型检查:LINQ的查询表达式是在编译时进行类型检查的,这样可以在编译时就发现错误,提高了代码的健壮性。
3.延迟加载:LINQ的查询通常支持延迟加载,只有在需要结果时才会执行查询操作,这样可以提高性能和效率。
4.集成查询:通过LINQ,可以对多个数据源进行集成查询,无论是集合、数据库还是XML等,都可以使用相同的查询语法进行查询和操作。
5.可组合性:LINQ的查询操作可以进行组合,可以将多个查询操作串联起来,形成复杂的查询链。
二、LINQ的用法1.查询语法LINQ提供了一种类似于SQL的查询语法,通过关键字from、where、select等来描述查询过程。
例如,对于一个整数集合,可以使用如下的查询语法来查询大于10的数字:```var query = from num in numberswhere num > 10select num;```其中,numbers是一个整数集合,num是每个元素的别名,select num表示选择满足条件的元素。
2.方法语法除了查询语法,LINQ还提供了一种方法语法,通过调用特定的查询方法来实现查询。
例如,对于上述的查询,可以使用方法语法来实现:```var query = numbers.Where(num => num > 10);```其中,Where是一个查询方法,num => num > 10表示一个Lambda表达式,表示筛选大于10的数字。
3.查询结果的使用通过LINQ的查询语法或方法语法,可以得到一个查询结果,可以将其转换为各种类型,进行进一步的操作。
linq或用法-回复如何使用LINQ(语言集成查询)进行数据查询和操作。
LINQ(Language Integrated Query)是.NET框架中的一个功能强大的查询工具,它允许开发人员使用统一的语法查询和操作各种数据源,如对象、集合、数据库和XML等。
本文将详细介绍LINQ的使用方法,包括查询操作符、延迟求值、数据排序和过滤等。
第一步:创建LINQ查询在开始使用LINQ之前,首先需要明确你要查询的数据源是什么。
这可以是一个对象集合、数据库表、XML文件等等。
假设我们要从一个对象集合中查询数据,首先需要创建一个表示该集合的对象。
csharpList<int> Numbers = new List<int> { 1, 2, 3, 4, 5, 6 };在上面的代码中,我们创建了一个名为Numbers的整数列表,其中包含了从1到6的数字。
第二步:使用查询操作符一旦我们创建了数据源,就可以使用查询操作符来对数据进行查询和操作。
常见的查询操作符包括Where、Select、OrderBy等。
下面将介绍一些常用的查询操作符。
1. Where:用于根据指定的条件筛选数据。
例如,我们可以使用Where 操作符来筛选出大于3的数字。
csharpvar result = Numbers.Where(n => n > 3);在上面的代码中,我们使用Where操作符和Lambda表达式来筛选出大于3的数字,结果将存储在result变量中。
2. Select:用于选择指定的数据。
例如,我们可以使用Select操作符来选择数字的平方。
csharpvar result = Numbers.Select(n => n * n);在上面的代码中,我们使用Select操作符和Lambda表达式来选择数字的平方,结果将存储在result变量中。
3. OrderBy:用于按照指定的属性对数据进行排序。
c#之linq——⼩⽩⼊门级通过本⽂需要掌握的关于linq的知识点为:linq的基本概念及其特点linq中常见操作及使⽤linq常见的⽅法查询1 Linq基本概念1.1 ling定义Linq(Language Integrated Query),语⾔集成查询,是⼀种使⽤类似SQL语句操作多种数据源的功能。
如,我们可以使⽤c#查询access数据库、.net数据集、xml⽂档以及实现了IEnumerable或IEnumerable<T>接⼝的集合类(如List,Array,SortedSet,Stack,Queue等,可以进⾏遍历的数据结构都会集成该类)。
从.net framework3.5中开始引⼊,能够提升程序数据处理能⼒和开发效率,具有集成性、统⼀性、可扩展性、抽象性、说明式编程、可组成型、可转换性等优势。
1.2 linq提供的程序Linq to Object。
提供程序查询内存中的集合和数组。
Linq to DataSet。
提供程序查询数据集中的数据。
Linq to SQL。
提供程序查询和修改Sql Server数据库中的数据,将应⽤程序中的对象模型映射到数据库表。
Linq to Entities。
使⽤linq to entities时,会在后台将linq语句转换为sql语句与数据库交互,并能提供数据变化追踪。
Linq to XML。
提供程序查询和修改XML,既能修改内存中的xml,也可以修改从⽂件中加载的。
2 Linq查询linq查询包括两种⽅式,⼀是语句查询,⼆是⽅法查询。
语句查询使⽤较多,也更容易理解,微软官⽹推荐使⽤。
下⾯介绍语句查询的⼦句使⽤。
2.1 from⼦句⽤来标识查询的数据源。
基本语法格式为:from 迭代变量 in 数据源⾸先,通过以下简单⽰例,给出from⽤法static void Main(string[] args){var nums = new int[] {56,97,98,57,74,86,31,90};var queryInfo = from num in nums select num;//num为数据中的每个元素(相当于foreach中迭代变量)var numStr = string.Empty;foreach (var item in queryInfo){numStr += item + " ";}Console.WriteLine($"数据元素包括:{numStr}");}运⾏结果如下图:注:查询表达式在循环访问查询变量时(如上述⽰例中foreach),才会执⾏。
跟我学LINQ TO SQL●LINQ是Language Integrated Query的简称,它是集成在.NET编程语言中的一种特性。
已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感知、静态类型等强类型语言的好处。
并且它同时还使得查询可以方便地对内存中的信息进行查询而不仅仅只是外部数据源。
●LINQ定义了一组标准查询操作符用于在所有基于.NET平台的编程语言中更加直接地声明跨越、过滤和投射操作的统一方式,标准查询操作符允许查询作用于所有基于IEnumerable<T>接口的源,并且它还允许适合于目标域或技术的第三方特定域操作符来扩大标准查询操作符集,更重要的是,第三方操作符可以用它们自己的提供附加服务的实现来自由地替换标准查询操作符,根据LINQ模式的习俗,这些查询喜欢采用与标准查询操作符相同的语言集成和工具支持。
●LINQ架构●相关命名空间一.LINQ简介●LINQ包括五个部分:LINQ to Objects、LINQ to DataSets、LINQ to SQL、LINQ toEntities、LINQ to XML。
●LINQ to SQL全称基于关系数据的.NET语言集成查询,用于以对象形式管理关系数据,并提供了丰富的查询功能。
其建立于公共语言类型系统中的基于SQL的模式定义的集成之上,当保持关系型模型表达能力和对底层存储的直接查询评测的性能时,这个集成在关系型数据之上提供强类型。
●LINQ to XML在System.Xml.LINQ命名空间下实现对XML的操作。
采用高效、易用、内存中的XML工具在宿主编程语言中提供XPath/XQuery功能等。
●第一步:建立dbml(Database Mark Language.数据库描述语言,是一种XML格式的文档,用来描述数据库,有点类似Nhibernate的映射文件)●第二步:创建一个页面,页面加入一个GridView控件●第三步:编写代码进行数据绑定●第四步:执行代码public partial class _Default : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){BindData();}}public void BindData(){NorthwindDataContext nt = new NorthwindDataContext();GridView1.DataSource = from c in nt.Customers select c.Orders;GridView1.DataBind();}}●LINQ是在之上的,那么在将来它会代替吗?●在大型项目中使用LINQ,它的效率如何呢?二.DataContenxt一、作用DataContext类型(数据上下文)是System.Data.Linq命名空间下的重要类型,用于把查询句法翻译成SQL语句,以及把数据从数据库返回给调用方和把实体的修改写入数据库。
功能●以日志形式记录DataContext生成的SQL●执行SQL(包括查询和更新语句)●创建和删除数据库DataContext是实体和数据库之间的桥梁,那么首先我们需要定义映射到数据表的实体。
二、定义实体类以Northwind数据库为例,右边Customer类被映射成一个表,对应数据库中的Customers 表。
然后在类型中定义了三个属性,对应表中的三个字段。
其中,CustomerID字段是主键,如果没有指定Column特性的Name属性,那么系统会把属性名作为数据表的字段名,也就是说实体类的属性名就需要和数据表中的字段名一致。
using System.Data.Linq.Mapping;[Table(Name = "Customers")]public class Customer{[Column(IsPrimaryKey = true)]public string CustomerID {get; set;}[Column(Name = "ContactName")]public string Name { get; set; }[Column]public string City {get; set;}}1、使用定义好的类与数据库进行交互using System.Data.Linq;DataContext ctx = new DataContext("server=.;database=Northwind;integrated security=sspi"); Table<Customer> Customers = ctx.GetTable<Customer>();GridView1.DataSource = from c in Customers where c.CustomerID.StartsWith("A") select new {顾客ID=c.CustomerID, 顾客名=, 城市=c.City};GridView1.DataBind();通过GetTable获取表示底层数据表的Table类型,显然,数据库中的Customers表的实体是Customer类型。
随后的查询句法,即使你不懂SQL应该也能看明白。
从Customers 表中找出CustomerID以“A”开头的记录,并把CustomersID、Name以及City封装成新的匿名类型进行返回。
2、日志功能using System.IO;NorthwindDataContext ctx = new NorthwindDataContext("server=xxx;database=Northwind;uid=xxx;pwd=xxx");StreamWriter sw = new StreamWriter(Server.MapPath(“log.txt”), true); //追加ctx.Log = sw;GridView1.DataSource = from c in ctx.Customers where c.CustomerID.StartsWith("A") select new { 顾客ID = c.CustomerID, 顾客名= , 城市= c.City };GridView1.DataBind();sw.Close();运行程序后在网站所在目录生成了log.txt,每次查询都会把诸如下面的日志追加到文本文件中:SELECT [t0].[CustomerID], [t0].[ContactName], [t0].[City]FROM [Customers] AS [t0]WHERE [t0].[CustomerID] LIKE @p0-- @p0: Input String (Size = 2; Prec = 0; Scale = 0) [A%]-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1应该说这样的日志对于调试程序是非常有帮助的。
3、执行SQL语句NorthwindDataContext ctx = newNorthwindDataContext("server=xxx;database=Northwind;uid=xxx;pwd=xxx");string newcity = "Shanghai";ctx.ExecuteCommand("update Customers set City={0} where CustomerID like 'A%'", newcity); IEnumerable<Customer> customers = ctx.ExecuteQuery<Customer>("select * from Customers where CustomerID like 'A%'");GridView1.DataSource = customers;GridView1.DataBind();虽然Linq to sql能实现90%以上的TSQL功能。
但是不可否认,对于复杂的查询,使用TSQL能获得更好的效率。
因此,DataContext类型也提供了执行SQL语句的能力。
4、使用DbDataReader数据源using System.Data.SqlClient;var conn = new SqlConnection("server=xxx;database=Northwind;uid=xxx;pwd=xxx");var ctx = new DataContext(conn);var cmd = new SqlCommand("select * from customers where CustomerID like 'A%'", conn); conn.Open();var reader = cmd.ExecuteReader();GridView1.DataSource = ctx.Translate<Customer>(reader);GridView1.DataBind();conn.Close();三.LINQ查询篇1、where●作用:起到过滤的作用●分类共计3种●简单形式●关系条件形式●First()形式1-1、简单形式例如:使用where筛选在伦敦的客户var q = from c in db.Customers where c.City == "London" select c;再如:筛选1994 年或之后雇用的雇员:var q = from e in db.Employees where e.HireDate >= new DateTime(1994, 1, 1) select e;1-2、关系条件形式筛选库存量在订货点水平之下但未断货的产品:var q = from p in db.Products where p.UnitsInStock <= p.ReorderLevel && !p.Discontinuedselect p;筛选出UnitPrice 大于10 或已停产的产品:var q = from p in db.Products where p.UnitPrice > 10m || p.Discontinued select p;下面这个例子是调用两次where以筛选出UnitPrice大于10且已停产的产品。