代码-linq多表连接查询速度很慢,但我在数据库查询分析器中却是秒查,请各位大侠帮我分析下

问题描述

linq多表连接查询速度很慢,但我在数据库查询分析器中却是秒查,请各位大侠帮我分析下
  1. with temp as
    (
    select (case when SHIFTSCHEDULEID is null then (case when TICKET_SELL_TYPE=2 then
    (select COMPANY_ID from TBL_YD_SHIFT where SHIFTNUMBER= (select SHIFTNUMBER from TBL_SP_TICKET where ticketid=a.REFUND_TICKET_ID)) else
    (select deptid from tbl_xt_user where userid=a.userid) end) else b.company_id end ) as deptid,
    a.userid,a.DAY, SELL_DATE,SELL_WAY,a.SHIFTNUMBER,ticketid,ticket_type,TICKET_STATE,TICKET_NO,IN_MONEY,out_money,REFUND_TICKET_ID
    from tbl_sp_ticket a left join TBL_YD_SHIFT b on a.SHIFTNUMBER=b.SHIFTNUMBER
    where TICKET_STATE not in(5,6)
    )
    select a.ticket_no,a.shiftnumber,a.DAY,a.STARTTIME,(select username from TBL_XT_USER where userid=a.USERID)as username,
    (select sitename from TBL_YD_SITE where siteid=a.ENDSITE)as sitename,
    (case when (a.TICKET_STATE =2 and b.TICKET_NO is null)then '未检'
    when (a.TICKET_STATE =2 and b.jp_state=0 and c.LD_NO is null)then '已检'
    when (a.TICKET_STATE =2 and b.jp_state=1 )then '退检'
    when (a.TICKET_STATE =2 and b.jp_state=0 and c.LD_NO is not null)then '已打路单'
    when a.TICKET_STATE =3 then '已退' when a.TICKET_STATE =5 then '破损'
    when a.TICKET_STATE =6 then '已废'end)as TicketState,
    (case a.TICKET_TYPE when 0 then '全票'when 1 then '半票'when 3 then'后付证'when 4 then '会员票' when 5 then '团体票'when 6 then '包车票'else '其它'end) as TicketType,
    a.IN_MONEY as priceJe,a.OUT_MONEY,
    isnull(c.ld_no,'')as Ld_No, a.SELL_DATE ,a.REFUND_TICKET_ID
    from tbl_sp_ticket a left join TBL_BB_JP b on a.TICKET_NO=b.TICKET_NO left join TBL_BB_WAYBILL c on b.LD_ID=c.ID
    这是数据库中的查询代码;
  2. public List GetSpRecordMxInfo(int deptid, DateTime startRq, DateTime endRq)
    {
    List list = new List();
    using (var dbContext = new SKJTDBContext())
    {

            var spUsers = from u in dbContext.Set<User>()
                          select new
                          {
                              userid = u.USERID,
                              username = u.USERNAME,
                              usercode = u.USERCODE,
                              deptid = u.DEPTID,
                              zwgsid=u.USERUNIT
                          };
            var tempusers = spUsers.Where(u => u.zwgsid == deptid);
            //查询只属于指定站务公司下卖出的车票记录,通过班次号关联班次档案信息来判断
            var shifts = dbContext.Set<Shift>().Where(s => s.COMPANY_ID == deptid);
            if (shifts == null || shifts.Count() == 0) return null;
            var spRecords = (from sp in dbContext.Set<Sp_Ticket>().Where(
                                s => s.SELL_DATE <= endRq && s.SELL_DATE >= startRq).Where(
                 s => !string.IsNullOrEmpty(s.SHIFTNUMBER))
                             join shift in shifts
                             on sp.SHIFTNUMBER equals shift.SHIFTNUMBER
                             select sp).ToList();
            if (spRecords == null || spRecords.Count() == 0) return null;
            var nullshiftRecords = dbContext.Set<Sp_Ticket>().Where(
                s => s.SELL_DATE <= endRq && s.SELL_DATE >= startRq).Where(
                s => string.IsNullOrEmpty(s.SHIFTNUMBER)).ToList();
            //单独处理班次号为空的情况
            if (nullshiftRecords != null || nullshiftRecords.Count() > 0)
            {
                foreach (var sp in nullshiftRecords)
                {
                    if (sp.TICKET_SELL_TYPE == TICKET_SELL_TYPE.退票)
                    {
                        var tempshift = dbContext.Set<Sp_Ticket>().Where(
                              r => r.TICKETID == sp.REFUND_TICKET_ID).FirstOrDefault().SHIFTNUMBER;
                        if (shifts.Any(s => s.SHIFTNUMBER == tempshift))
                            spRecords.Add(sp);
                        else continue;
                    }
                    else
                    {
                        if (tempusers.Any(r => r.userid == sp.USERID))
                            spRecords.Add(sp);
                        else continue;
                    }
                }
            }
            var results = from t in spRecords
                          join jp in dbContext.Set<Bb_Jp>().Where(w => w.OPER_TIME > startRq)
                          on t.TICKETID equals jp.TICKETID
                          into results1
                          from t_jp in results1.DefaultIfEmpty()
                          join ld in dbContext.Set<Bb_Waybill>().Where(w => w.OPER_TIME > startRq)
                          on t_jp == null ? new Bb_Jp().LD_ID : t_jp.LD_ID equals ld.ID
                          into results2
                          from t_jp_ld in results2.DefaultIfEmpty()
                          select new SpTicketRecordMx
                          {
                              TicketNO = t.TICKET_NO == null ? string.Empty : t.TICKET_NO,
                              ShiftNumber = t.SHIFTNUMBER == null ? string.Empty : t.SHIFTNUMBER,
                              StartRq = t.STARTTIME,
                              time = t.STARTTIME == null ? string.Empty : ((DateTime)t.STARTTIME).ToString("t"),
                              TicketState = t_jp == null ? t.TICKET_STATE.ToString() : (t_jp.JP_STATE == JP_STATE.已检 ? (t_jp.LD_ID == null ? "已检未打路单" : "已打路单") :(t.TICKET_STATE==TICKET_STATE.已退? "已退": "退检")),
                              EndSite = t.ENDSITE == null ? string.Empty : dbContext.Set<Site>().Where(
                              s => s.SITEID == t.ENDSITE).FirstOrDefault().SITENAME,
                              PriceJe = t.IN_MONEY,
                              Out_Money = t.OUT_MONEY,
                              RefoundTicketID = t.REFUND_TICKET_ID,
                              Ld_No = t_jp_ld == null ? string.Empty : t_jp_ld.LD_NO,
                              TicketType = t.TICKET_SELL_TYPE.ToString(),
                              UserName = spUsers.Where(u => u.userid == t.USERID).FirstOrDefault() == null ? "SPYA" :
                              spUsers.Where(u => u.userid == t.USERID).FirstOrDefault().username,
                              OperateRq = (DateTime)t.SELL_DATE
                          };
            // var liettemp = results.ToList();
            return results.ToList();
    
        }
    
    }
            这是c#写的代码,这代码运行时查询得20多秒,请问各位好心的大婶这段代码怎么优化,小弟感激不敬!新手求各位大婶指点!
    

解决方案

问题可能是你用了tolist
tolist会返回所有的记录,这很恐怖。尽量把where groupby join这些放在tolist之前执行。

解决方案二:

谢谢一楼的回答,这是我第一次在csdn发帖,不太熟悉额,我貌似只在两个位置用了两个tolist,一处是在代码注释语句“//单独处理班次号为空的情况”上面,另一处是方法最后,因为这是该方法的类型,结合你说的,我还是不大明白

解决方案三:

补充一下:不以为方便的组件,性能就一定好,在进行真正的数据库查询前后,linq还要执行很多的解释性代码和转换代码,而这些事会有个触发点,
就是ToListToArray....

解决方案四:

我个人感觉linq在多表链接查询时速度不是蛮理想,可能是我对linq的理解不够,希望各位大虾大婶指导下,谢谢了

时间: 2024-12-23 00:14:47

代码-linq多表连接查询速度很慢,但我在数据库查询分析器中却是秒查,请各位大侠帮我分析下的相关文章

sql用IN查询速度很求教各位高手慢,

问题描述 sql用IN查询速度很求教各位高手慢, CTRL+L提示缺少索引,要怎么优化?有没有别的代替?谢谢各位 解决方案 sql的where语句中查询某个时间之后的话速度异常慢 解决方案二: 你把代码贴出来看看啊,你只说很慢能给你什么好的建议 解决方案三: IN所查找的那列建立索引等,而且可以用数据库性能工具查看一下性能瓶颈在什么地方 解决方案四: 要看 in所属字段类型及表里存储条数,要是多的话,在字段上加个索引可以吗 解决方案五: 要看 in所属字段类型及表里存储条数,要是多的话,在字段上

线程-请大神帮我看下这部分代码怎么写?谢谢!很急

问题描述 请大神帮我看下这部分代码怎么写?谢谢!很急 如图所示,我把基本通讯功能已经实现,但是我想实现下图中红色圈中部分的功能,自动发送跟数据格式的功能怎么实现啊,希望发送端跟接收端都可以实现这个数据格式的功能,谢谢 整体代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System; using System.Data; usin

eclipse-模糊搜索,为什么只显示一条信息,代码如下,请各位大侠帮帮忙吧

问题描述 模糊搜索,为什么只显示一条信息,代码如下,请各位大侠帮帮忙吧 Dim texts As StringDim mrc As ADODB.RecordsetSet mrc = New ADODB.RecordsetSet mrc = ExecuteSQL(txtsql1) 'If mrc.EOF = False Then With MSF1 .Rows = 22 .Row = 1 mrc.MoveFirst Do While Not mrc.EOF For i = 1 To 2 .Text

谁帮我分析下这些代码,我想替换链接地址怎么找文件位置,我是菜鸟,求帮助

问题描述 谁帮我分析下这些代码,我想替换链接地址怎么找文件位置,我是菜鸟,求帮助http://www.zyp369.com/member/login.php?gourl=http://www.zyp369.com/ask/这个页面,导航栏的地址,我想换掉,从首页进去点击导航,地址已经换好了,但是进入个人中心后,上面的地址还是不对,求帮忙

请各位大虾帮我分析一下一段代码是否存在问题?

问题描述 编写了一个接口提供平板调用,在本地测试是没有问题的,可以生成txt文件,但是更新到客户服务器却没有生成txt文件,但又没有报错.好怪,自己怀疑是使用了线程导致的?对线程不了解,第一次使用!WebServiceMethod.SyncComInfo这个方法用来获取Json,数据量较大执行比较久,然而使用了线程.///<summary>同步企业信息(包括相关的证书信息)///编码字段:Wat_ComInfo:Com_Des,Com_Brand:Wat_BreedWay:Bre_Produc

oracle 查询 数据量大 速度很慢

问题描述 具体需求是这样的:查询库存(库存实时变动的,变动不频繁可以用物化视图,但是实际很频繁),建立视图查询速度很慢,虽然能查出来但是速度真的好慢,客户抱怨了好多回了.请教下诸位有什么好办法没 解决方案 1)首先要确定是不是数据量大造船的,检查方法在原有SQL条件下面缩小范围,比如以前查1个月,现在查一分钟.以前查1W商品,现在查10个商品. 2)如果小数据查询也慢,那就缩小范围了,优化索引,不仅仅是简单数据量大造成的.3)如果小数据查询快,大数据查询慢,并且几乎是线性的. 那么几乎是无解吧,

关于未来网站访问速度及后台查询速度的优化建议

1. 数据库设计:数据库内所有表结构均添加索引 调整原因: 近日数据库压力很大,经查有些大数据量表的查询速度很慢,导致数据库服务器CPU一直持续90%-100%,将这些表添加索引后,CPU很快变正常. 2. 将大数据表做分库.分区处理: 具体操作如下: 1).将大数据表与主数据库分离,单独新建一个数据库,然后将这些表做分区: 2).将数据插入到消息队列内,后台利用windows计划任务执行(5分钟执行一次)C#控制台程序将消息队列内的数据批量(消息队列内有50000条记录,一次性插入到数据表内)

基于Web的交互式数据库查询技术简介

web|交互|数据|数据库 1 概述 Web技术是一项很新的技术,它不仅为Internet的广泛普及起到关键性的作用,而且还在其他相关计算机网络应用技术发展中起到关键作用,例如Intranet.电子商务等,目前它已成为计算机网络应用的一个主要技术,尤其重要的技术是web动态技术,与后台数据库的交互式动态查询技术.本文针对常用的web动态技术,与数据库交互技术作以介绍. 2 实现Web动态技术的几种方法 2.1 利用CGI实现Web动态技术 在Web应用中,与其他动态编程技术相比,CGI技术虽然是

海量数据库查询语句_MsSql

以下代码说明了我们实例中数据库的"红头文件"一表的部分数据结构: CREATE TABLE [dbo].[TGongwen] (    --TGongwen是红头文件表名   [Gid] [int] IDENTITY (1, 1) NOT NULL ,--本表的id号,也是主键   [title] [varchar] (80) COLLATE Chinese_PRC_CI_AS NULL ,  --红头文件的标题   [fariqi] [datetime] NULL ,--发布日期