首页 新闻 搜索 专区 学院

EF -- 生成的SQL能控制么?

0
悬赏园豆:10 [已解决问题] 解决于 2014-11-04 19:57

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

 

 

 

算了的主页 算了 | 初学一级 | 园豆:3
提问于:2014-11-03 18:50
< >
分享
最佳答案
0

你怎么这么喜欢ToList?一个LINQ语句写了两个ToList。

收获园豆:10
爱编程的大叔 | 高人七级 |园豆:30753 | 2014-11-03 19:53

IQueryable<> 的 在我的认知里 不好通过for 循环遍历。

或者可能成为一种思维定式了吧。。。。。。(上面的是我的主要原因)

 

 (from g in context.goods
  from od in ods

问题中ods 是IQueryable<>

 

但是一旦 能够确定数据的话,我都喜欢转成list

算了 | 园豆:3 (初学一级) | 2014-11-03 20:01

@算了: 胡说八道。

只要实现了IEnumerable接口的就可以For each,Iqueryable的定义如下 

public interface IQueryable<out T> : IEnumerable<T>, 
    IQueryable, IEnumerable

 

SQLServer : EXEC和sp_executesql的区别

爱编程的大叔 | 园豆:30753 (高人七级) | 2014-11-03 20:06

@爱编程的大叔: 

大叔,突然用个严厉的词汇词汇,就是有震撼力啊

嗯?大叔的意思是 我所说的【IQueryable<> 不好通过for遍历】吧,

这个我承认只是我一时的感觉而已。应该是我没找对方法把。那时候有点郁闷就索性直接tolist()了,后来也没找到什么有用的资料,所以也就认为了。。。。。这点是我偷懒了。。

这个个接口的定义 ,我当时也F12看了看的,但是,应该是自己认识不深刻导致才有这么个结论吧

---------------

还来说说这个问题吧

我的环境是在 虚拟机上搭建的,很多天没有重启了(每次关机,就挂起 呵呵)

刚刚重启了下虚拟机,然后发现 上述SQL语句在 Sql server查询窗口中执行,永不了33秒了,2秒完事了

不过运行项目 却还是 报 timeout的异常。

很郁闷,但又无从下手,所以。我就把 项目里timeout的瞬间设置了更长的时间

现在项目能正常运行了

且。。。更奇怪的事情就是,项目中点击 链接 跳转画面 到画面显示出来,仅仅也只用3-4秒的时间。

那我就更郁闷了。

sql server中同样的sql 语句 执行 用2秒

页面打开也只用3-4秒

但是timeout设置 如果不设置较长的时间。就是报timeout  ,,这个怎么都想不通

 

 

算了 | 园豆:3 (初学一级) | 2014-11-03 21:24

@算了: 数据库在哪儿?

爱编程的大叔 | 园豆:30753 (高人七级) | 2014-11-03 21:35

@爱编程的大叔: 

公司里是  在局域网中不同机器上,我们使用的环境也都是安装在机器上的,就像大叔在以前的问题中回复的那样

悄悄你告诉大叔,我把公司的数据库偷回家了,我的环境

是在 虚拟机上装的,数据库在同一个虚拟机上  呵呵 

算了 | 园豆:3 (初学一级) | 2014-11-03 21:43

@爱编程的大叔: 他们不用 MVC 这套东西,我就把数据库和数据偷回家,自己练MVC呢

算了 | 园豆:3 (初学一级) | 2014-11-03 21:45

@爱编程的大叔: 

SQLServer : EXEC和sp_executesql的区别 

刚刚看了,之前就用过 两次 sp_executesql 而 exec 执行动态sql  ,却不知道,感谢大叔

算了 | 园豆:3 (初学一级) | 2014-11-03 21:55
其他回答(1)
0

是你的linq写的有问题.你写这样的语句,肯定坑EF啊

吴瑞祥 | 园豆:28979 (高人七级) | 2014-11-03 18:51

写的不好,那说说怎么写好?

支持(0) 反对(0) 算了 | 园豆:3 (初学一级) | 2014-11-03 19:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册