在LINQ to SQL中使用Translate方法以及修改查询用SQL
{
ItemDataContext dataContext = new ItemDataContext();
var query = from item in dataContext.Items
where item.UserID == ownerId
orderby item.CreateTime descending
select item;
return query.ToList();
}
{
ItemDataContext dataContext = new ItemDataContext();
var query = from item in dataContext.Items
where item.UserID == ownerId
orderby item.CreateTime descending
select new Item
{
ItemID = item.ItemID,
Title = item.Title,
UserID = item.UserID,
CreateTime = item.CreateTime
};
return query.ToList();
}
使用Translate方法
{
ItemDataContext dataContext = new ItemDataContext();
dataContext.Connection.Open();
SqlCommand command = new SqlCommand(
"SELECT [ItemID], [Title], [UserID], [CreateTime]" +
" FROM [Item] WHERE [UserID] = " + ownerId +
" ORDER BY [CreateTime]",
(SqlConnection)dataContext.Connection);
using (DbDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection))
{
return dataContext.Translate<Item>(reader).ToList();
}
}
- 为什么调用ExecuteReader方法时要传入CommandBehavior.CloseConnection:LINQ to SQL中的DataContext对象有个特点,如果在使用时它的Connection对象被“显式”地打开了,即使调用了DataContext对象的Dispose方法也不会自动关闭。因此我们在开发程序的时候一定要注意这一点。例如,在调用ExecuteReader是传入CommandBehavior.CloseConnection,这样就保证了在关闭DbDataReader时同时关闭Connection——当然,我们也可以不这么做。
- 在调用Translate方法后为什么要直接调用ToList方法:因为GetItemsForListing方法的返回值是List<Item>,这是原因之一。另一个原因是Translate方法并不会直接生成所有的对象,而是在外部代码访问Translate方法返回的IEnmuerable<T>时才会生成其中每个对象。这也是一种Lasy Load,但是也导致了所有的对象必须在Reader对象关闭之前生成,所以我一般都会在Translate方法后直接调用ToList方法,保证所有的对象已经生成了。虽然事实上我们也可以不使用using关键字而直接返回Translate方法生成的IEnumerable<Item>,不过这么做的话当前链接就得不到释放(释放,而不是关闭),也就是把处理数据连接的问题交给了方法的使用者——很可能就是业务逻辑层。为了确保分层结构的职责分明,我一般倾向于在这里确保所有对象的已经生成了。
{
public static List<T> ExecuteQuery<T>(this DataContext dataContext, IQueryable query)
{
DbCommand command = dataContext.GetCommand(query);
dataContext.OpenConnection();
using (DbDataReader reader = command.ExecuteReader())
{
return dataContext.Translate<T>(reader).ToList();
}
}
private static void OpenConnection(this DataContext dataContext)
{
if (dataContext.Connection.State == ConnectionState.Closed)
{
dataContext.Connection.Open();
}
}
}
{
ItemDataContext dataContext = new ItemDataContext();
var query = from item in dataContext.Items
where item.UserID == ownerId
orderby item.CreateTime descending
select new
{
ItemID = item.ItemID,
Title = item.Title,
CreateTime = item.CreateTime,
UserID = item.UserID
};
using (dataContext.Connection)
{
return dataContext.ExecuteQuery<Item>(query);
}
}
publicpartial class Item : INotifyPropertyChanging, INotifyPropertyChanged
{
[Column(Storage = "_OwnerID", DbType = "Int NOT NULL", Name = "UserID")]
public int OwnerID
{
get {...}
set {...}
}
}
{
ItemDataContext dataContext = new ItemDataContext();
var query = from item in dataContext.Items
where item.OwnerID == ownerId
orderby item.CreateTime descending
select new
{
ItemID = item.ItemID,
Title = item.Title,
CreateTime = item.CreateTime,
OwnerID = item.OwnerID
};
using (dataContext.Connection)
{
return dataContext.ExecuteQuery<Item>(query);
}
}
FROM [dbo].[Item] AS [t0]
WHERE [t0].[UserID] = @p0
ORDER BY [t0].[CreateTime] DESC
{
ItemDataContext dataContext = new ItemDataContext();
var query = from item in dataContext.Items
where item.OwnerID == ownerId
orderby item.CreateTime descending
select new
{
ItemID = item.ItemID,
Title = item.Title,
CreateTime = item.CreateTime,
UserID = item.OwnerID
};
using (dataContext.Connection)
{
return dataContext.ExecuteQuery<Item>(query);
}
}
改变LINQ to SQL所执行的SQL语句
{
public static List<T> ExecuteQuery<T>(
this DataContext dataContext, IQueryable query, bool withNoLock)
{
DbCommand command = dataContext.GetCommand(query, withNoLock);
dataContext.OpenConnection();
using (DbDataReader reader = command.ExecuteReader())
{
return dataContext.Translate<T>(reader).ToList();
}
}
private static Regex s_withNoLockRegex =
new Regex(@"(] AS \[t\d+\])", RegexOptions.Compiled);
private static string AddWithNoLock(string cmdText)
{
IEnumerable<Match> matches =
s_withNoLockRegex.Matches(cmdText).Cast<Match>()
.OrderByDescending(m => m.Index);
foreach (Match m in matches)
{
int splitIndex = m.Index + m.Value.Length;
cmdText =
cmdText.Substring(0, splitIndex) + " WITH (NOLOCK)" +
cmdText.Substring(splitIndex);
}
return cmdText;
}
private static SqlCommand GetCommand(
this DataContext dataContext, IQueryable query, bool withNoLock)
{
SqlCommand command = (SqlCommand)dataContext.GetCommand(query);
if (withNoLock)
{
command.CommandText = AddWithNoLock(command.CommandText);
}
return command;
}
}
{
ItemDataContext dataContext = new ItemDataContext();
var query = from item in dataContext.Items
where item.UserID == ownerId
orderby item.CreateTime descending
select new
{
ItemID = item.ItemID,
Title = item.Title,
CreateTime = item.CreateTime,
UserID = item.UserID
};
using (dataContext.Connection)
{
return dataContext.ExecuteQuery<Item>(query, true);
}
}
FROM [dbo].[Item] AS [t0] WITH (NOLOCK)
WHERE [t0].[UserID] = @p0
ORDER BY [t0].[CreateTime] DESC
以上扩展所受限制
foreach(Item item in itemList)
{
foreach (ItemComment comment in item.Comments)
{
Console.WriteLine(comment.Content);
}
}
{
ItemDataContext dataContext = new ItemDataContext();
DataLoadOptions loadOptions = new DataLoadOptions();
loadOptions.LoadWith<Item>(item => item.Comments);
dataContext.LoadOptions = loadOptions;
var query = from item in dataContext.Items
where item.UserID == ownerId
orderby item.CreateTime descending
select item;
return query.ToList();
}
SELECT COUNT(*)
FROM [dbo].[ItemComment] AS [t2]
WHERE [t2].[ItemID] = [t0].[ItemID]
) AS [value]
FROM [dbo].[Item] AS [t0]
LEFT OUTER JOIN [dbo].[ItemComment] AS [t1] ON [t1].[ItemID] = [t0].[ItemID]
WHERE [t0].[UserID] = @p0
ORDER BY [t0].[CreateTime] DESC, [t0].[ItemID], [t1].[ItemCommentID]
在LINQ to SQL中使用Translate方法以及修改查询用SQL相关推荐
- SQL中关于EXISTS的嵌套子查询问题
SQL中关于EXISTS的嵌套子查询问题 SQL语句中,没有蕴含式和全程量词,所以这个时候,我们可以用离散数学的理论,将命题变化,然后使用EXISTS语句来查询,确实有点难以理解,下面我举一个例子来解 ...
- Sql中存储过程的定义、修改和删除操作
Sql中存储过程的定义.修改和删除操作 1.存储过程的分类 系统存储过程 本地存储过程(用户自定义) 临时存储过程(局部[#].全局[##]临时存储过程) 2.创建存储过程 ? 1 2 3 4 5 6 ...
- sql中聚合函数和分组函数_学习SQL:聚合函数
sql中聚合函数和分组函数 SQL has many cool features and aggregate functions are definitely one of these feature ...
- PostgreSQL SQL中的ALL,ANY,SOME的用法,sql查询速度优化,sql运行优化
PostgreSQL SQL中的ALL,ANY,SOME的用法,sql查询速度优化,sql运行优化 准备两个表: --T1(2,3) --T2(1,2,3,4)--ALL,ANY,SOME 的子查询 ...
- CSS3中使用translate() 方法实现元素位置的移动
translate() 方法 通过 translate() 方法,元素从其当前位置移动,根据给定的 left(x 坐标) 和 top(y 坐标) 位置参数: 实例 div { transform: t ...
- 【SQL】SQL中的IN方法:查询多种状态值
一.起因 因为要查询两种状态的值,如果用普通的查询,需要查两次,再把两次查询的值放到一个集合中,再去重,这样查找非常麻烦,所以决定优化,使用SQL中的IN查询: SELECT column_name( ...
- SQL - waitfor delay/time(SQL中延迟时间的方法)
一.waitfor介绍 功能:指定触发语句块.存储过程或事务执行的时间.时间间隔或事件. 语法:WAITFOR { DELAY 'time' | TIME 'time' } 参数:DELAY:指等过了 ...
- sql 中 FROM_UNIXTIME 使用方法
根据format字符串格式化date值. 下列修饰符可以被用在format字符串中:%M 月名字(January--December) %W 星期名字(Sunday--Saturday) %D 有英语 ...
- SQL中Case when 方法的使用
update T_Product set amount=( case when quantity<10 then amount*(1-0.1) when quantity between 10 ...
最新文章
- 简单的横向ListView实现(version 3.0)
- java 自定义异常 未回滚_抛出自定义异常,spring AOP事务不回滚的解决方案
- mysql连接池_基于Swoole的通用连接池 - 数据库连接池(life)
- MyBatis常用配置解析-mapper标签
- 如果只看一篇文章弄懂Pfile与spfile,那么这篇就够了……
- ubuntu20.04安装讯飞输入法(失败经历)
- loardrunner- 集合点函数设置
- FIIL邬宁:AI能锦上添花,但耳机成不了下一个智能音箱
- UVA10302 Summation of Polynomials【数学】
- ge linux安装apt_教你如何在 Linux 中使用 apt 命令
- python编写脚本方法_python写dnf脚本录制自己点击
- Ant Design与Ant Design pro入门
- PostgresSQL 使用实践
- 常用API——Object、Objects、StringBuilder
- 女人喝酸奶要注意什么
- android 获取全国地址,Android获取所有国家列表
- 微信小程序 常用组件
- 鸿蒙入门手册(二):应用是怎样运行的
- 慎用鲁大师 360等软件
- Oracle 19C 下载和安装
热门文章
- C# 算法题系列(一) 两数之和、无重复字符的最长子串
- Java 单测 回滚
- php应用数据库连接中的单例模式
- C#里巧用DateTime预设一些可选的日期范围(如本年度、本季度、本月等)
- WSS 3.0中An unexpected error has occurred的一个解决方案
- 关于多库操作一些想法
- IOS之截取特定字符串
- ccd相机好修吗_「CCD购买指南 」CCD废片大公开
- python时间序列分析航空旅人_python时间序列分析
- envi插件大津法_IDL打开科学数据集