数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Linq To Sql常用方法使用总结


发布日期:2024年04月09日
 
Linq To Sql常用方法使用总结

准备工作

数据表

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 dcTable

select t;

s就是表Table中所有的集合

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

var s = from t in dcTable

select new

{

tID

tCol

};

这样就只返回ID列和Col

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

var s = from t in dcTable

select new

{

myID = tID

myCol = tCol

};

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

带条件查询

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

DBContext dc = new DBContext();

var s = from t in dcTable

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

select t;

还有一种更简单的方法

var s = dcTableWhere(u=>uColEquals(ABC));

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

var s = dcTableFirst() //取第一条数据

var s = dcTableLast() //取最后一条数据

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

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

数据总数

DBContent dc = new DBContent();

var s = from t in dcTable

select new

{

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

};

sCount(); //这里就是数据总条数

还有一种更简单的方法

int totailNo = dcTableCount(); //这里的Count()里面同样可以加条件(u=>uColEquals(ABC))

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

DBContent dc = new DBContent();

var s = from t in dcTable

join t in dcTable

on tID equals toID //注用了join on后面必需用 equals

select new

{

TID

TCol

T Remarks

};

左链接

var s = from t in dcTable

join t in dcTable

on t ID equals toID into tempT

from t in tempTDefaultIfEmpty()

select ……

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

Group by 语法

var result = from t in dcTable

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

select new

{

objID = tempTKey

myCol = tsMax(p => p Col)

};

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

分页

var s = from t in ctbTests

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

select new

{

myID = tID

myCol = tCol

};

GridViewDataSource = sSkip(startRowIndex)Take(rowCount);

GridViewDataBind();

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 = ExpressionInvoke(expr exprParametersCast<Expression>());

return ExpressionLambda<Func<T bool>>(ExpressionOr(exprBody invokedExpr) exprParameters);

}

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

{

var invokedExpr = ExpressionInvoke(expr exprParametersCast<Expression>());

return ExpressionLambda<Func<T bool>>(ExpressionAnd(exprBody invokedExpr) exprParameters);

}

}

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

下面进行动态查询

var searchPredicate = PredicateExtensionsTrue<Table>();

string col = textBoxText;

int col = intPrase(textBoxText);

if (!stringIsNullOrEmpty(col))

{

searchPredicate = searchPredicateAnd(u => uColContains(col));

}

if(col != )

{

searchPredicate = searchPredicateAnd(u => uColEquals(col));

}

DBContent dc = new DBContent();

var s = from t in dcTableWhere(searchPredicate)

select t;

查询出来的数据再查询

DBContent dc = new DBContent();

var s = from t in dcTable

select t;

var q = from t in dcTable

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

on toID equals tID

select ……

外部数据作中条件检索

int[] colList = new int[] {};

DBContent dc = new DBContent();

var s = from t in dcTableWhere(u=>colListContains(uCol)) //查询列Col的值包含在colList中的数据(和 in 语法差不多)

select t;

               

上一篇:Sybase数据备份之BCP用法简介

下一篇:ADO.NET访问Oracle 9i存储过程(下)