LINQ体验(9)——LINQ_to_SQL语句之Insert、Update、Delete操作
- 格式:pdf
- 大小:93.95 KB
- 文档页数:7
使用LINQ to SQL建模Northwind数据库在这之前一起学过LINQ to SQL设计器的使用,下面就使用如下的数据模型:当使用LINQ to SQL设计器设计以上定义的五个类(Product,Category,Customer,Order和OrderDetail)的时候,每个类中的属性都映射了相应数据库中表的列,每个类的实例则代表了数据库表中的一条记录。
另外,当定义数据模型时,LINQ to SQL设计器同样会创建一个自定义DataContext类,来作为数据库查询和应用更新/变化的主要渠道。
以上数据模型中定义的DataContext类命名为“NorthwindDataContext”。
该类中包含了代表每个建模数据库表的属性。
使用LINQ语法表达式可以十分简单的使用NorthwindDataContext类来查询和检索数据库中的数据。
LINQ to SQL会在运行时自动的转换LINQ表达式到适当的SQL代码来执行。
例如,编写以下LINQ表达式来根据Product Name检索单个Product对象:还可以使用LINQ表达式来检索所有不存在于Order Details中的,并且UnitPrice大于100的所以Product:变化跟踪和DataContext.SubmitChanges()当执行查询和检索像Product实例这样的对象时,LINQ to SQL会自动保持对这些对象任何变化或更新的跟踪。
我们可以进行任意次数的查询,以及使用LINQ to SQL的DataContext类作出更新,而这些变化都会被全部跟踪。
注意:LINQ to SQL的变化跟踪发生于调用者端——而不是在数据库中。
这就意味着使用跟踪不会销耗任何数据库资源,也不需要在数据库中改变/安装任何组件模块。
当对从LINQ to SQL中检索的对象作出更改之后,我们可以选择调用DataContext上的SubmitChange()方法来应用变化返回到数据库。
sql linq写法SQL和LINQ都是用于查询和操作数据的语言,但它们的写法有一些区别。
下面是一些SQL查询的LINQ写法示例:1.SQL中的SELECT语句可以选择特定的列,而在LINQ中,可以使用对象属性的方式来选择列。
例如,假设有一个名为“Customers”的表,其中包含“CustomerID”、“CustomerName”和“ContactName”等列,要选择其中的“CustomerName”和“ContactName”列,SQL语句为:2.sql复制代码SELECT CustomerName, ContactName FROM Customers;而在LINQ中,可以这样写:c复制代码var query = from c in db.Customersselect new { c.CustomerName, c.ContactName };1.SQL中的WHERE子句用于过滤数据,而在LINQ中,可以使用Lambda表达式或匿名函数来过滤数据。
例如,要选择“Customers”表中“Country”为“Germany”的所有客户,SQL语句为:2.sql复制代码SELECT * FROM Customers WHERE Country = 'Germany';而在LINQ中,可以这样写:c复制代码var query = db.Customers.Where(c => c.Country == "Germany");1.SQL中的JOIN操作可以用于连接两个或多个表,而在LINQ中,可以使用Join方法或导航属性来连接表。
例如,要选择所有订单及其相关的客户信息,SQL语句为:2.vbnet复制代码SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDateFROM OrdersINNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;而在LINQ中,可以这样写:c复制代码var query = from o in db.Ordersjoin c in db.Customers on o.CustomerID equals c.CustomerIDselect new { o.OrderID, c.CustomerName, o.OrderDate };1.SQL中的GROUP BY子句可以按照指定的列对结果进行分组,而在LINQ中,可以使用GroupBy方法对结果进行分组。
linq转化为sql语句的方法Linq转化为SQL语句的方法概述Linq(Language Integrated Query)是微软推出的一种用于查询和操作数据的统一编程模型。
它可以在不同的数据源上执行查询,例如关系型数据库、XML文档等。
在开发过程中,我们常常需要将Linq 表达式转化为相应的SQL语句,以便对数据库进行操作。
本文将详细介绍多种将Linq转化为SQL语句的方法。
1. LINQ to SQL基本概念LINQ to SQL是一种将LINQ查询转化为SQL语句的方法。
它是Entity Framework的一部分,提供了一种直接在.NET应用程序中使用对象来表示和操作关系型数据库的方式。
在LINQ to SQL中,可以通过DataContext对象来执行查询,并将查询结果转化为SQL语句。
示例代码using System;using ;using ;public class Program{public static void Main(){// 创建DataContext对象,连接数据库DataContext context = new DataContext("Data Sour ce=.;Initial Catalog=MyDatabase;Integrated Security=True ");// 创建查询表达式var query = from c in <Customer>()where == "Beijing"select c;// 执行查询并获取SQL语句string sql = (query).CommandText;// 输出SQL语句(sql);}}2. Entity Framework基本概念Entity Framework是微软推出的一种对象关系映射(ORM)工具,可以映射.NET对象与数据库中的表、视图等关系。
linq to sql 插入值,以及如何取回自增的IDlinq to s ql 在插入值的时候还是很方便。
有时候我们需要在插入一个新的实体之后得到那个实体的主键I D的值,这个I D当然必须是自增。
一段时间我一直认为直接使用linq to s ql的插入机制是不可以在做到的,所以只有使用存储过程的,具体可以查看这篇文章:h ttp:///2008/01/c us tom-ins ert-logic-with-linq-to-s ql.html,但是总是觉得这样太麻烦了。
通过观察linq t o s ql插入之后产生的s ql发现,它自动生成了两条语句,一条ins ert,一条s elec t,而且那条s elec t正好就是查询的最后生成的主键ID,真是不可思议呀。
下面以一个实际的代码演示一下:1.新建一个新闻表:列名数据类型允许为NU LL 默认值主键----------------------------------------------------------------------------ID int 自增是Title nvarc har(200)P ubDate datetime getdate()Tag nvarc har(200) 是2.通常的做法就是新建一个Linq to s ql 的类文件,然后通过可视化设计器把数据表拖到设计器中,但是这样一"托"永逸的做法是根本不行的,还要需要修改一些地方,数据库中默认值的字段除了主键在自动生成的linq to s ql的类文件中所对应的属性上面的列特性是没有标记Is DbGenerated=tr ue的,这一点是必须要修改的。
在本例中要修改的就是在P ubdate属性把I sDbGenerated=true添加上,当然也可以在可视化的方式修改:3.下面就来测试linq to s ql 中插入值所产生的s ql语句:us ing (DemoDataContext db = new DemoDataContext()) {db.Log = new WebA pp.DataServer.DebuggerWriter(); N ews news = new N ew s { Title = "测试" };db.N ews.I nsertOnSubmit(news);db.SubmitChanges();}对应产生的s ql语句:看的很清楚一条ins ert ,一条s elect ,注意s elec t中的字段正式设置了默认生成的字段。
LINQ查询的目的是从指定的数据源中查询满足符合特定条件的数据元素,并且通过根据需要对这些查询的元素进行排序、连接等操作。
所以LINQ查询包含如下几个主要元素:•数据源:数据源表示LINQ查询将从哪里查找数据,它通常是一个或多个数据集,每个数据集包含一系列的元素。
数据集是一个类型为IEnumerable<T>或IQueryable<T>的对象,可以对它进行枚举,遍历每一个元素。
此外,它的元素可以是任何数据类型,所以可以表示任何数据的集合。
•目标数据:数据源中的元素并不定是查询所需要的结果。
目标数据用来指定查询的具体想要的是什么数据。
在LINQ中,它定义了查询结果数据集中元素的具体类型。
•筛选条件:筛选条件定义了对数据源中元素的过滤条件。
只有满足条件的元素才作为查询结果返回。
筛选条件可以是简单的逻辑表达式表示,也可以用具有复杂逻辑的函数来表示。
•附加操作:附加操作表示一些其它的具体操作。
比如,对查询结果进行分组等。
其中,数据源和目标数据库是LINQ查询的必备元素,筛选条件和附加操作是可选元素。
2.用from子句指定数据源每个LINQ查询都以from子句开始,from子句包括以下两个功能。
•指定查询将采用数据源。
•定义一个本地变量,表示数据源中单个元素。
单个from子句的编写格式如下所示。
其中dataSource表示数据源,localVar 表示单个元素。
from localVar in dataSource3.用select子句指定目标数据select子句指定在执行查询时产生结果的数据集中元素的类型,它的格式如下所示:select element4.用where子句指定筛选条件在LINQ中,用where子句指定查询的过滤条件,它的格式如下:where expression其中,express是一个逻辑表达式,返回布尔值“真”或“假”在LINQ查询中,还可以使用多个并列的where子句来进行多个条件过滤。
Linq基础+Lambda表达式对数据库的增删改及简单查询⼀、Linq to sql 类⾼集成化的数据库访问技术使⽤Linq可以代替之前的,省去了⾃⼰敲代码的实体类和数据访问类的⼤量⼯作实体类:添加⼀个Linq to sql 类 ----选择要使⽤的数据库---- 拖⼊要使⽤的表需要⽴即保存就相当于创建实体类如果进⾏属性扩展,在App_Code下添加类,类名同表名⼀致。
将该类在访问修饰符后加上partial,将该类定为实体类的⼀部分数据访问类:不⽤在App_Code下再建数据访问类了。
直接在使⽤数据访问类的地⽅⽤数据库上下⽂进⾏编写。
ers.ToList(); //是将Users表转化为⼀个泛型集合。
也就相当于查询全部的⽅法⼆、利⽤Linq对数据库进⾏相关操作1、添加数据每⼀条数据都是⼀个实体类对象。
先将其实例化出来,再给对象的每个属性赋值。
在数据访问类中进⾏添加数据操作添加的⽅法:ers.InsertOnSumbit(对象);⽅法执⾏结束后提交对数据库的更改:con.SubmitChanges();2、删除数据删除数据前要先查到这条数据再进⾏删除操作通过ids进⾏查询这条数据返回⼀个对象Users u = ers.Where(r=>r.ids.Tostring()==ids).FirstOrDefault();where括号内接的是Lambda表达式,r代表⼀个Users对象,=>是基本格式,FirstOrDefault()返回第⼀条数据或者返还空如果u不是空,则在数据访问类中进⾏删除。
ers.DeleteOnSubmit(对象);con.SubmitChanges();3、数据修改数据的修改同样也是需要先查到这条数据,将返回的这个对象的要修改的属性进⾏重新赋值最后con.SubmitChanges();4、简单数据查询直接在数据访问类中根据对象的属性进⾏查询,多个查询条件中间⽤ && 连接;如 ers.Where(r=>erName=="zhangsan" && r.PassWord=="123").FirstOrDefault();。
LinqToSQL和LinqToObject的批量操作InsertAllOnSubmit介绍⽆论是Linq To SQL还是Linq To Object(Entity frameworks)它们都为开发⼈员提供了Insert操作,及Insert集合操作,即InsertOnSubmit和InsertAllOnSubmit,前者是将⼀个实体标记为⼀个插⼊状态,⽽后都是将⼀个集合标记为插⼊状态,...⽆论是Linq To SQL还是Linq To Object(Entity frameworks)它们都为开发⼈员提供了Insert操作,及Insert集合操作,即InsertOnSubmit和InsertAllOnSubmit,前者是将⼀个实体标记为⼀个插⼊状态,⽽后都是将⼀个集合标记为插⼊状态,⽽当前进⾏这两种操作时,你并没有与数据库进⾏连接,这就是LINQ提倡的延时加载,那它们什么时候与数据库进⾏真正的交互呢,实现上,实验表明,是在触发SubmitChanges⽅法时,才会真实与数据库进⾏操作,这是正常的,也没有什么可以说的。
⽽今天我主要说的就是,当我们进⾏批量插⼊时,⽤linq给我们提供的InsertAllOnSubmit⽅法是否可以实现我们的操作,如果实现了,那是否是我们能够接受的⽅式,我们在做⼀个实验吧⼀个列表:1 2 3 4 5 6 7 8 9List userList=new List();for(int i=0;i<100000;i++){userList.Add(new User{Name="zzl"+i}); }_db.InsertAllOnSubmit(userList);_db.SubmitChanges();结果怎么样呢?经过我的观察,结果是正确的,10万条数据可以插⼊到数据库中,LINQ确实是帮助我们完成了列表的插⼊⼯作,但过程我们是否可以接受?可以肯定的说,不可以,⽽且是⾮常不可以,对于这个插⼊操作,它对数据服务器的压⼒是惊⼈的,它建⽴“链接”次为10万次,即每个Insert 语句就建⽴⼀个链接,这是我们不能接受的,所以,LINQ的批量操作确实靠不住。
updatesql用法更新SQL语句是在数据库中修改已存在数据的过程。
当需要对数据库进行更改、插入或删除行时,可以使用更新SQL语句来实现。
以下是更新SQL语句的用法和步骤详解。
一、基本语法和关键字更新SQL语句的基本语法如下:UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;其中,`table_name`表示要更新的表名,`column1`, `column2`, ...表示要更新的列,`value1`, `value2`, ...表示要设置的新值,`condition`表示筛选要更新行的条件。
在更新SQL语句中,还有一些关键字需要了解:1. UPDATE:关键字用于指示要执行更新操作。
2. SET:关键字用于指定要更新的列和它们的新值。
3. WHERE:关键字用于筛选要更新的行。
二、更新SQL语句的步骤要执行更新SQL语句,可以按照以下步骤进行:步骤1:确定要更新的表首先,需要确定要进行更新操作的数据库表。
可以使用`UPDATE`语句后面的关键词`table_name`来指定要更新的表。
步骤2:确定要更新的列和新值其次,需要确定要更新的列以及要为这些列设置的新值。
可以使用`SET`关键字后面的列名和新值来指定。
步骤3:指定更新的行然后,需要指定要更新的行。
可以使用`WHERE`关键字后面的条件来筛选要更新的行。
可以使用多种条件运算符(如等于、大于、小于等)来指定具体的条件。
步骤4:执行更新操作最后,执行更新操作。
当更新SQL语句执行完成后,数据库中的相应行将会被更新为指定的新值。
三、实际应用示例为了更好地理解更新SQL语句的用法,下面举一个实际的示例。
假设有一个名为"students"的表,包含三列:id、name、score。
现在需要将id 为1的学生的分数更新为90分。
简单的linq to sql 的例子,实现了增删改查2011/03/03 575 自己先要建立一个名为bbs的数据库里面要建立一个名为linqtoTest的表。
在添加项目中添加linq to sql 类,再把资源管理器打开,新建连接,找到你建立的那个数据库。
把那个表拖到 那个linq to sql 类中。
就行了。
using System;using System.Data.SqlClient;using System.Data;using System.Linq;using System.Web.UI.WebControls;using System.Data.Linq; public partial class linq_boundfield_ : System.Web.UI.Page{ linqtoTestDataContext db_Test = new linqtoTestDataContext(); protected void Page_Load(object sender, EventArgs e) { if (!this.IsPostBack) { // getDatabind1(); getDatabind2(); } } /// summary /// 这是用我们平常/// 的方法来绑定数据/// /summary //void getDatabind1() //{ // SqlConnection con = DB.createsql(); // con.Open(); // string sql = “select * from LinqtoTest”; // SqlCommand cmd = new SqlCommand(sql, con); // SqlDataAdapter sda = new SqlDataAdapter(cmd); // DataSet ds = new DataSet(); // sda.Fill(ds, “linqtoTest”); // this.GridView1.DataSource = ds.Tables[“linqtoTest”].DefaultView; // this.GridView1.DataBind(); //} //这是用linq来绑定数据 void getDatabind2() { //linqtoTestDataContext db_Test = new linqtoTestDataContext(); this.GridView1.DataSource = db_Test.LinqtoTest;。
详解MySQL数据库insert和update语句⽤于操作数据库的SQL⼀般分为两种,⼀种是查询语句,也就是我们所说的SELECT语句,另外⼀种就是更新语句,也叫做数据操作语句。
SQL语句中的更新语句update是最常⽤的语句之⼀,⾔外之意,就是对数据进⾏修改。
在标准的SQL中有3个语句,它们是INSERT、UPDATE以及DELETE。
⽤于操作数据库的SQL⼀般分为两种,⼀种是查询语句,也就是我们所说的SELECT语句,另外⼀种就是更新语句,也叫做数据操作语句。
⾔外之意,就是对数据进⾏修改。
在标准的SQL中有3个语句,它们是INSERT、UPDATE以及DELETE。
在MySQL中⼜多了⼀个REPLACE语句,因此,本⽂以MySQL为背景来讨论如何使有SQL中的更新语句。
⼀、INSERT和REPLACEINSERT和REPLACE语句的功能都是向表中插⼊新的数据。
这两条语句的语法类似。
它们的主要区别是如何处理重复的数据。
1. INSERT的⼀般⽤法MySQL中的INSERT语句和标准的INSERT不太⼀样,在标准的SQL语句中,⼀次插⼊⼀条记录的INSERT语句只有⼀种形式。
INSERT INTO tablename(列名…) VALUES(列值);⽽在MySQL中还有另外⼀种形式。
INSERT INTO tablename SET column_name1 = value1, column_name2 = value2,…;第⼀种⽅法将列名和列值分开了,在使⽤时,列名必须和列值的数⼀致。
如下⾯的语句向users表中插⼊了⼀条记录:INSERT INTO users(id, name, age) VALUES(123, '姚明', 25);第⼆种⽅法允许列名和列值成对出现和使⽤,如下⾯的语句将产⽣中样的效果。
INSERT INTO users SET id = 123, name = '姚明', age = 25;如果使⽤了SET⽅式,必须⾄少为⼀列赋值。
sql update 写法SQL是结构化查询语言,并且是关系型数据库系统(RDBMS)的一部分。
一般来讲,我们要更新数据库中的数据时,就需要使用SQL语句中的update命令了。
update命令帮助我们修改数据库中的数据,以符合新的要求。
在这篇文章中,我们将分享有关Update SQL命令的一些写法,以帮助大家更好地了解它们的用法。
1. 语法update command用于在SQL中更改数据库中的现有数据。
它的一般语法如下:UPDATE table_nameSET column1 = value1, column2 = value2, ...WHERE condition;其中,'table_name' 指向要更新的表格名称。
后面的‘column = value’用于设定需要更新的数据,而‘WHERE’ 用于设定更新的目标。
2. 设置多个列和值你也可以在单个UPDATE语句中设置多个列和值,但是需要保证每一列名和值之间都要用逗号隔开。
例如:UPDATE table_nameSET column1 = value1, column2 = value2, column3 = value3 WHERE condition;这将更新列名为'column1'、'column2'和'column3'所对应的单元格,这些单元格都对应着不同的值。
3. 条件语句条件语句中的WHERE可以帮助我们筛选出要更新的特定数据,例如:UPDATE table_nameSET column1 = value1WHERE column2 = 'some value';这将更新与“column2”包含“some value”的所有单元格中的“column1”。
4. 更新多条记录你可以写一个UPDATE语句来更新多个记录。
在这种情况下,使用WHERE子句来确定要更新的记录范围。
掌握SQL四条最基本的数据操作语句:Insert,Select,Update和Delete。
练掌握SQL是数据库用户的宝贵财富。
在本文中,我们将引导你掌握四条最基本的数据操作语句—SQL的核心功能—来依次介绍比较操作符、选择断言以及三值逻辑。
当你完成这些学习后,显然你已经开始算是精通SQL了。
在我们开始之前,先使用CREATE TABLE语句来创建一个表(如图1所示)。
DDL 语句对数据库对象如表、列和视进行定义。
它们并不对表中的行进行处理,这是因为DDL 语句并不处理数据库中实际的数据。
这些工作由另一类SQL语句—数据操作语言(DML)语句进行处理。
SQL中有四种基本的DML操作:INSERT,SELECT,UPDATE和DELETE。
由于这是大多数SQL用户经常用到的,我们有必要在此对它们进行一一说明。
在图1中我们给出了一个名为EMPLOYEES的表。
其中的每一行对应一个特定的雇员记录。
请熟悉这张表,我们在后面的例子中将要用到它。
INSERT语句用户可以用INSERT语句将一行记录插入到指定的一个表中。
例如,要将雇员John Smith的记录插入到本例的表中,可以使用如下语句:INSERT INTO EMPLOYEES V ALUES('Smith','John','1980-06-10','Los Angles',16,45000);通过这样的INSERT语句,系统将试着将这些值填入到相应的列中。
这些列按照我们创建表时定义的顺序排列。
在本例中,第一个值“Smith”将填到第一个列LAST_NAME中;第二个值“John”将填到第二列FIRST_NAME中……以此类推。
我们说过系统会“试着”将值填入,除了执行规则之外它还要进行类型检查。
如果类型不符(如将一个字符串填入到类型为数字的列中),系统将拒绝这一次操作并返回一个错误信息。
LINT TO SQL增删改protected IQueryable<Products> GetQuery(decimal pId) //定制一个查询方法,返回产品id大于指定id的对象集{pdc = new LINQtoSQLDataContext();var query = from product in pdc.Productswhere product.pId > pIdselect product;return query;}protected void btnSelect_Click(object sender, EventArgs e) //查找{int id = 0;if (TextBox1.Text.Length == 0){this.TextBox1.Text = "请输入整数!";this.TextBox1.Focus();}else{id = Convert.ToInt32(TextBox1.Text);var query = GetQuery(id);if (query.Count() > 0){GridView_Show.DataSource = query;GridView_Show.DataBind();lblInfo.T ext = "查询id号大于" + id + "的记录成功";}else{lblInfo.T ext = "不存在满足条件的记录";}}}protected void btnUpdate_Click(object sender, EventArgs e) //更新{try{int id = 0;if (this.TextBox2.Text.Length == 0){this.TextBox2.Text = "请输入数字!将增大productId字段";this.TextBox2.Focus();}else{id = Convert.ToInt32(TextBox2.Text);foreach (Products prod in GetQuery(1)){prod.ProductId += (int)id;}pdc.SubmitChanges();GridView_Show.DataSource = GetQuery(0);GridView_Show.DataBind();lblInfo.T ext = "把ProductId增加了" + id;}}catch{lblInfo.T ext = "执行失败!";}}protected void btnInsert_Click(object sender, EventArgs e) //插入{pdc = new LINQtoSQLDataContext();Products newproduct = new Products();//int id = Convert.ToInt32(TextBox3.Text);//newproduct.pId = id; 不能给主键赋值,赋值无效newproduct.ProductId = 1;newproduct.ProductName = "橙子";newproduct.ProductSupplierId = 1;pdc.Products.InsertOnSubmit(newproduct); //插入一条记录pdc.SubmitChanges();GridView_Show.DataSource = GetQuery(0);GridView_Show.DataBind();lblInfo.T ext = "插入一条记录成功!";}protected void btnDelete_Click(object sender, EventArgs e) //删除{pdc = new LINQtoSQLDataContext();int id = Convert.ToInt32(this.T extBox4.Text);IEnumerable<Products> query = from product in pdc.Products //查询数据库中满足条件的数据集where product.ProductSupplierId == idselect product;pdc.Products.DeleteAllOnSubmit(query); //一次删除一批记录pdc.SubmitChanges(); //提交与正式执行更改申请//Single()和SingleOrDefault()都只返回一条记录,前者在没有记录的情况下会抛出一个InvalidOperationnException的异常,//后者只是简单地返回一个默认值//Products pro = pdc.Products.SingleOrDefault(t => t.pId == id);//pdc.Products.DeleteOnSubmit(pro); //一次只能删除一条记录//lblInfo.Text = "删除id号为" + id + "的记录成功!";//重新绑定到GridView_Show中GridView_Show.DataSource = from product in pdc.Productsselect product;GridView_Show.DataBind();}。
LINQ(数据库操作增、删、改及并发管理)本文将演示如何通过Entity Framework 数据模型创建、修改、删除数据库记录。
为了在数据库里创建新纪录,需要创建相应实体类的新实例,填充字段,把实体类加入ObjectContext 派生类维护的EntityCollection,然后调用SaveChanges()写入新纪录:Customer cust = new Customer(){CustomerID = "LAWN",CompanyName = "Lawn Wranglers",ContactName = "Mr. Abe Henry",ContactTitle = "Owner",Address = "1017 Maple Leaf Way",City = "Ft. Worth",Region = "TX",PostalCode = "76104",Country = "USA",Phone = "(800) MOW-LAWN",Fax = "(800) MOW-LAWO"};NorthwindEntities db = new NorthwindEntities();db.Customers.AddObject(cust);db.SaveChanges();可以多次AddObject()后调用一次SaveChanges()全部写入数据库。
1. 创建部分加载的实体类在之前的示例里,我们调用了Customer 实体类的默认构造函数,它创建的实例没有加载任何数据。
不过,我们还可以通过在构造函数里指定必须字段的值来减少数据库错误的风险。
每个实体类都有一个名为CreateT 的工厂方法,例如,Customer 的实体类的工厂方法是CreateCustomer 。
运算符转换1.AsEnumerable:将类型转换为泛型 IEnumerable使用 AsEnumerable<TSource> 可返回类型化为泛型 IEnumerable 的参数。
在此示例中,LINQ to SQL(使用默认泛型 Query)会尝试将查询转换为 SQL 并在服务器上执行。
但 where 子句引用用户定义的客户端方法 (isValidProduct),此方法无法转换为 SQL。
解决方法是指定 where 的客户端泛型 IEnumerable<T> 实现以替换泛型 IQueryable<T>。
可通过调用 AsEnumerable<TSource>运算符来执行此操作。
var q =from p in db.Products.AsEnumerable()where isValidProduct(p)select p;语句描述:这个例子就是使用AsEnumerable以便使用Where的客户端IEnumerable实现,而不是默认的IQueryable将在服务器上转换为SQL并执行的默认Query<T>实现。
这很有必要,因为Where子句引用了用户定义的客户端方法isValidProduct,该方法不能转换为SQL。
2.ToArray:将序列转换为数组使用 ToArray <TSource>可从序列创建数组。
var q =from c in db.Customerswhere c.City == "London"select c;Customer[] qArray = q.ToArray();语句描述:这个例子使用 ToArray 将查询直接计算为数组。
3.ToList:将序列转换为泛型列表使用 ToList<TSource>可从序列创建泛型列表。
下面的示例使用 ToList<TSource>直接将查询的计算结果放入泛型 List<T>。