本主题演示如何在 Web 应用程序中使用 O/R 设计器创建表示 SQL Server 数据库的数据类。
这些数据类必须放置在 Web 应用程序的 App_Code 文件夹或其子文件夹中。如果将数据类包括在 App_Code 的子文件夹中,则会将该子文件夹的名称用作类的命名空间。在此情况下,必须在连接至数据类时提供该命名空间。
使用O/R 设计器时,会自动将用于访问数据库的连接字符串添加到 Web.config 文件中。
创建这些类后,即可使用 LinqDataSource 控件、ObjectDataSource 控件或 LINQ 查询连接它们。
从数据库表中创建类
如果网站上还没有 App_Code 文件夹,请在“解决方案资源管理器”中右击相应的项目,再单击“添加 ASP.NET 文件夹”,然后单击“App_Code”。
右击 App_Code 文件夹,然后单击“添加新项”。
在“已安装的模板”下,选择“LINQ to SQL 类”模板,为 .dbml 文件键入一个名称,然后单击“添加”。
此时将显示“对象关系设计器”窗口。
在“服务器资源管理器”中,将该数据库表拖入“对象关系设计器”窗口。
在设计器窗口中,该表及其列都表示为实体。
保存 .dbml 文件。
这会在 .dbml 文件下面创建一个 .designer.cs 或 .designer.vb 文件。该文件包含一个表示数据库的类和一个表示表的类。该数据库类的无参数构造函数将从 Web.config 文件中读取连接字符串。
准备工作
数据表
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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)