linq to sql 中怎么添加数据?

linq to sql 中怎么添加数据?,第1张

DBLinqToSqlDataContext Db = new DBLinqToSqlDataContext() //实例化上下文\x0d\x0aError_Log LOG = new Error_Log() \x0d\x0aException ee = new Exception()\x0d\x0aLOG.Object = ee.Source\x0d\x0aLOG.TargetSite = ee.TargetSite.ToString()\x0d\x0aLOG.MessAge = ee.Message\x0d\x0aLOG.Time = DateTime.Now\x0d\x0aDb.Error_Log.InsertOnSubmit(LOG)//插入\x0d\x0aDb.SubmitChanges() //提交 这里运行才能真正的插入数据库\x0d\x0a\x0d\x0aResponse.Redirect("GeneralError.aspx")

LINQ to SQL语句之Insert/Update/Delete *** 作这篇我们来讨论Insert/Update/Delete *** 作 这个在我们的程序中最为常用了 我们直接看例子

Insert/Update/Delete *** 作Insert 简单形式说明 new一个对象 使用InsertOnSubmit方法将其加入到对应的集合中 使用SubmitChanges()提交到数据库

NorthwindDataContextdb =newNorthwindDataContext()varnewCustomer =newCustomer{    CustomerID = MCSFT     CompanyName = Microsoft     ContactName = John Doe     ContactTitle = Sales Manager     Address = Microsoft Way     City = Redmond     Region = WA     PostalCode =     Country = USA     Phone = ( )     Fax =null}db Customers InsertOnSubmit(newCustomer)db SubmitChanges()一对多关系说明 Category与Product是一对多的关系 提交Category(一端)的数据时 LINQ to SQL会自动将Product(多端)的数据一起提交

varnewCategory =newCategory{    CategoryName = Widgets     Description = Widgets are the …… }varnewProduct =newProduct{    ProductName = Blue Widget     UnitPrice = M     Category = newCategory}db Categories InsertOnSubmit(newCategory)db SubmitChanges()多对多关系说明 在多对多关系中 我们需要依次提交

varnewEmployee =newEmployee{    FirstName = Kira     LastName = Smith }varnewTerritory =newTerritory{    TerritoryID =     TerritoryDescription = Anytown     Region = db Regions First()}varnewEmployeeTerritory =newEmployeeTerritory{    Employee = newEmployee     Territory = newTerritory}db Employees InsertOnSubmit(newEmployee)db Territories InsertOnSubmit(newTerritory)db EmployeeTerritories InsertOnSubmit(newEmployeeTerritory)db SubmitChanges()Override using Dynamic CUD说明 CUD就是Create Update Delete的缩写 下面的例子就是新建一个ID(主键)为 的Region 不考虑数据库中有没有ID为 的数据 如果有则替换原来的数据 没有则插入 (不知道这样说对不对 大家指点一下)

RegionnwRegion =newRegion(){    RegionID =     RegionDescription = Rainy }db Regions InsertOnSubmit(nwRegion)db SubmitChanges()Update说明 更新 *** 作 先获取对象 进行修改 *** 作之后 直接调用SubmitChanges()方法即可提交 注意 这里是在同一个DataContext中 对于不同的DataContex看下面的讲解

简单形式Customercust =    db Customers First(c =>c CustomerID == ALFKI )cust ContactTitle = Vice President db SubmitChanges()多个项varq =frompindb Productswherep CategoryID == selectpforeach(varpinq){    p UnitPrice += M}db SubmitChanges()Delete 简单形式说明 调用DeleteOnSubmit方法即可

OrderDetailorderDetail =    db OrderDetails First    (c =>c OrderID == &&c ProductID == )db OrderDetails DeleteOnSubmit(orderDetail)db SubmitChanges()一对多关系说明 Order与OrderDetail是一对多关系 首先DeleteOnSubmit其OrderDetail(多端) 其次DeleteOnSubmit其Order(一端) 因为一端是主键

varorderDetails =fromoindb OrderDetailswhereo Order CustomerID == WARTH &&    o Order EmployeeID == selectovarorder =    (fromoindb Orderswhereo CustomerID == WARTH &&o EmployeeID == selecto) First()foreach(OrderDetailodinorderDetails){    db OrderDetails DeleteOnSubmit(od)}db Orders DeleteOnSubmit(order)db SubmitChanges()Inferred Delete(推断删除)说明 Order与OrderDetail是一对多关系 在上面的例子 我们全部删除CustomerID为WARTH和EmployeeID为 的数据 那么我们不须全部删除呢?例如Order的OrderID为 的OrderDetail有很多 但是我们只要删除ProductID为 的OrderDetail 这时就用Remove方法

Orderorder = db Orders First(x =>x OrderID == )OrderDetailod =     order OrderDetails First(d =>d ProductID == )order OrderDetails Remove(od)db SubmitChanges()Update with Attach说明 在对于在不同的DataContext之间 使用Attach方法来更新数据 例如在一个名为tempdb的NorthwindDataContext中 查询出Customer和Order 在另一个NorthwindDataContext中 Customer的地址更新为 First Ave Order的CustomerID 更新为CHOPS

lishixinzhi/Article/program/net/201311/12904

准备工作

数据表

Table

ID        int        PK

Col         varchar( )

Col         int

======================================

Table

ID        int        PK

oID        int        FK

Remarks        varchar( )

======================================

方法简介

    查询

DBContext dc = new DBContext()              //实例化Linq To SQL 类

var s = from t in dc Table

select t

s就是表Table 中所有的集合

如果需要返回Table 中的某几列

var s = from t in dc Table

select new

{

t ID

t Col

}

这样就只返回ID列和Col 列

如果要给返回的列指定别名 写法如下

var s = from t in dc Table

select new

{

myID = t ID

myCol = t Col

}

这就相当于SQL语句中的 select ID as myID Col as myCol from Table

    带条件查询

查询Table 中Col 列的值等于 ABC的所有记录

DBContext dc = new DBContext()

var s = from t in dc Table

where t Col == ABC     //或者 where t Col Equals( ABC ) 模糊查询用where t Col Contains ( ABC ) 相当于SQL语句中的 like %ABC%

select t

还有一种更简单的方法

var s = dc Table Where(u=>u Col Equals( ABC ))

在vs 中 已经将所有容器(数组)都封闭了如上方法 类似的还有

var s = dc Table First()    //取第一条数据

var s = dc Table Last()    //取最后一条数据

但是这样写 必需注意异常处理 比如取第一条数据时 如果表Table 中根本就没有任何数据 则该语句会直接出错

所以要么先判断表中的数据条数 要么加try…catch…进行处理

    数据总数

DBContent dc = new DBContent()

var s = from t in dc Table

select new

{

t ID    //为了速度更快点 所以只返回一列

}

s Count()    //这里就是数据总条数

还有一种更简单的方法

int totailNo = dc Table Count()    //这里的Count()里面同样可以加条件(u=>u Col Equals( ABC ))

    两表联合查询(及左链接)

DBContent dc = new DBContent()

var s = from t in dc Table

join t in dc Table

on t ID equals t oID          //注 用了join on后面必需用 equals

select new

{

T ID

T Col

T Remarks

}

左链接

var s = from t in dc Table

join t in dc Table

on t ID equals t oID into tempT

from t in tempT DefaultIfEmpty()

select ……

Linq中的左连接(或右连接)就是使用DefaultIfEmpty()语法 但是使用DefaultIfEmpty()也需要用到into语法 如上例所示 在语句执行过后 t 是已经不存在了 因为它已经将数据转移到tempT中了 而tempT也不存在了 同样是因为通过DefaultIfEmpty()语法将数据转移到t 中了

    Group by 语法

var result = from t in dc Table

group t by t ID into tempT    //这一步已经不存在 t 了 而 t 中的数据都到 tempT中了(数据是没移动的)

select new

{

objID = tempT Key

myCol = ts Max(p =>p Col )

}

在Linq 中 使用group by 就必需使用into(也就是将group by 以后的数据放到一个新的容器中) 另外 值得注意的是 例子中的 objID= tempT Key 这里也可以看出 是使用的tempT 而不是t 说明通过group by…into… 已经将查询出来的结果放进了tempT中 而tempT Key就是 group by 后面的t ID

    分页

var s = from t in c tbTests

order by t ID    //分页都需要用到order by 还将可能引起返回的数据不准确

select new

{

myID = t ID

myCol = t Col

}

GridView DataSource = s Skip(startRowIndex) Take(rowCount)

GridView DataBind()

startRowIndex 当前数据页数的第一条数据

rowCount:每页显示的数据条数

比如

页数用 pageIndex表示

当前是第一页 (pageIndex= startRowIndex= )

每页显示 条数据 (rowCount= )

那么我们显示下一页数据时 pageIndex= startRowIndex就应该是 (startRowIndex * RowCount)

    多条件动态查询

首先得写一个类(用于加载动态条件的)

/// <summary>

/// 生成多条件动态查询的条件结构 : AND用true OR用false

/// </summary>

public static class PredicateExtensions

{

public static Expression<Func<T bool>>True<T>() { return f =>true}

public static Expression<Func<T bool>>False<T>() { return f =>false}

public static Expression<Func<T bool>>Or<T>(this Expression<Func<T bool>>expr Expression<Func<T bool>>expr )

{

var invokedExpr = Expression Invoke(expr expr Parameters Cast<Expression>())

return Expression Lambda<Func<T bool>>(Expression Or(expr Body invokedExpr) expr Parameters)

}

public static Expression<Func<T bool>>And<T>(this Expression<Func<T bool>>expr Expression<Func<T bool>>expr )

{

var invokedExpr = Expression Invoke(expr expr Parameters Cast<Expression>())

return Expression Lambda<Func<T bool>>(Expression And(expr Body invokedExpr) expr Parameters)

}

}

上面这部分是一个老外写的 嘿嘿

下面进行动态查询

var searchPredicate = PredicateExtensions True<Table >()

string col = textBox Text

int col = int Prase(textBox Text)

if (!string IsNullOrEmpty(col ))

{

searchPredicate = searchPredicate And(u =>u Col Contains(col ))

}

if(col != )

{

searchPredicate = searchPredicate And(u =>u Col Equals(col ))

}

DBContent dc = new DBContent()

var s = from t in dc Table Where(searchPredicate )

select t

    查询出来的数据再查询

DBContent dc = new DBContent()

var s = from t in dc Table

select t

var q = from t in dc Table

join t in s           //这里是将查询的数据 s 再进行查询

on t oID equals t ID

select ……

    外部数据作中条件检索

int[] col List = new int[ ] { }

DBContent dc = new DBContent()

var s = from t in dc Table Where(u=>col List Contains(u Col ))    //查询列Col 的值包含在col List中的数据(和 in 语法差不多)

lishixinzhi/Article/program/net/201311/11336


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/8001172.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存