准备工作
数据表
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;