C# 代码
---------
List<GoodDTO> goods = (from g in context.goods
from od in ods
where od.goods_id == g.goods_id
&& g.delet_mark == "0"
select new GoodDTO
{
goods_ab = g.goods_ab,
goods_id = g.goods_id,
goods_name = g.goods_name,
GoodsPackLevel = (from gp in context.goods_pack_level
where gp.goods_id == od.goods_id
select new GoodsPackLevelDTO
{
goods_id = gp.goods_id,
goods_pack = gp.goods_pack,
goods_spec = gp.goods_spec,
max_count = gp.max_count,
this_count = gp.this_count
}).ToList()
}).ToList();
--------------------
生成的SQL
---------
exec sp_executesql N'SELECT
[Project1].[orders_serial_num] AS [orders_serial_num],
[Project1].[orders_id] AS [orders_id],
[Project1].[orders_type] AS [orders_type],
[Project1].[C1] AS [C1],
[Project1].[goods_ab] AS [goods_ab],
[Project1].[goods_id] AS [goods_id],
[Project1].[goods_name] AS [goods_name],
[Project1].[C2] AS [C2],
[Project1].[goods_id1] AS [goods_id1],
[Project1].[goods_pack] AS [goods_pack],
[Project1].[goods_spec] AS [goods_spec],
[Project1].[max_count] AS [max_count],
[Project1].[this_count] AS [this_count]
FROM ( SELECT
[Extent1].[goods_id] AS [goods_id],
[Extent1].[goods_ab] AS [goods_ab],
[Extent1].[goods_name] AS [goods_name],
[Extent2].[orders_id] AS [orders_id],
[Extent2].[orders_type] AS [orders_type],
[Extent2].[orders_serial_num] AS [orders_serial_num],
1 AS [C1],
[Extent3].[goods_id] AS [goods_id1],
[Extent3].[goods_pack] AS [goods_pack],
[Extent3].[goods_spec] AS [goods_spec],
[Extent3].[this_count] AS [this_count],
[Extent3].[max_count] AS [max_count],
CASE WHEN ([Extent3].[goods_id] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C2]
FROM [dbo].[goods] AS [Extent1]
INNER JOIN [dbo].[orders_detail] AS [Extent2] ON [Extent2].[goods_id] = [Extent1].[goods_id]
LEFT OUTER JOIN [dbo].[goods_pack_level] AS [Extent3] ON [Extent3].[goods_id] = [Extent2].[goods_id]
WHERE ([Extent2].[orders_type] = @p__linq__0) AND ([Extent2].[orders_id] = @p__linq__1) AND (N''0'' = [Extent1].[delet_mark])
) AS [Project1]
ORDER BY [Project1].[orders_serial_num] ASC, [Project1].[orders_id] ASC, [Project1].[orders_type] ASC, [Project1].[goods_id] ASC, [Project1].[C2] ASC',N'@p__linq__0 nvarchar(4000),@p__linq__1 nvarchar(4000)',@p__linq__0=N'供货订单',@p__linq__1=N'0000277659'
这个SQL 我实验了下
整整运行了33秒
导致页面直接就异常了
【Timeout 时间已到。在操作完成之前超时时间已过或服务器未响应。】
这个异常可以通过设置timeout来避免,咱们这里不讨论这个
主要是生成的SQL
如果不使用 “sp_executesql” ,直接运行 语句
则时间很短很短
能够控制生成的SQL,让它不使用 sp_executesql
你怎么这么喜欢ToList?一个LINQ语句写了两个ToList。
IQueryable<> 的 在我的认知里 不好通过for 循环遍历。
或者可能成为一种思维定式了吧。。。。。。(上面的是我的主要原因)
(from g in context.goods
from od in ods
问题中ods 是IQueryable<>
但是一旦 能够确定数据的话,我都喜欢转成list
@算了: 胡说八道。
只要实现了IEnumerable接口的就可以For each,Iqueryable的定义如下
public interface IQueryable<out T> : IEnumerable<T>, IQueryable, IEnumerable
@爱编程的大叔:
大叔,突然用个严厉的词汇词汇,就是有震撼力啊
嗯?大叔的意思是 我所说的【IQueryable<> 不好通过for遍历】吧,
这个我承认只是我一时的感觉而已。应该是我没找对方法把。那时候有点郁闷就索性直接tolist()了,后来也没找到什么有用的资料,所以也就认为了。。。。。这点是我偷懒了。。
这个个接口的定义 ,我当时也F12看了看的,但是,应该是自己认识不深刻导致才有这么个结论吧
---------------
还来说说这个问题吧
我的环境是在 虚拟机上搭建的,很多天没有重启了(每次关机,就挂起 呵呵)
刚刚重启了下虚拟机,然后发现 上述SQL语句在 Sql server查询窗口中执行,永不了33秒了,2秒完事了
不过运行项目 却还是 报 timeout的异常。
很郁闷,但又无从下手,所以。我就把 项目里timeout的瞬间设置了更长的时间
现在项目能正常运行了
且。。。更奇怪的事情就是,项目中点击 链接 跳转画面 到画面显示出来,仅仅也只用3-4秒的时间。
那我就更郁闷了。
sql server中同样的sql 语句 执行 用2秒
页面打开也只用3-4秒
但是timeout设置 如果不设置较长的时间。就是报timeout ,,这个怎么都想不通
@算了: 数据库在哪儿?
@爱编程的大叔:
公司里是 在局域网中不同机器上,我们使用的环境也都是安装在机器上的,就像大叔在以前的问题中回复的那样
悄悄你告诉大叔,我把公司的数据库偷回家了,我的环境
是在 虚拟机上装的,数据库在同一个虚拟机上 呵呵
@爱编程的大叔: 他们不用 MVC 这套东西,我就把数据库和数据偷回家,自己练MVC呢
是你的linq写的有问题.你写这样的语句,肯定坑EF啊
写的不好,那说说怎么写好?