none
linq to entites 写查询语句 如何复用 查询中的语句 RRS feed

  • 问题

  • 我在网上看了一些文章,对于一些简单的linq 可以用expression来拼 ,但是仍然不知道复杂的如何来拼,难道真需要用那种极其复杂的繁琐的表达式树,一点点的拼起来吗?那不是噩梦么?

    如下: from tohos in
    orgCancel(start, end)
    group tohos by new { tohos.RESERVE_TIME.Year, Half = (tohos.RESERVE_TIME.Month - 1) / 6 }
    into gs
    select new
    {
    gs.Key,
    Group = gs.GroupBy(c => new
    {
    c.RESERVE_TIME.Year,
    c.RESERVE_TIME.Month,
    c.RESERVE_TIME.Day
    }
    ).Select(d => new
    {
    d.Key,
    Count = denoReservePatientCount(start, end, d.Key.Year, d.Key.Month, d.Key.Day, d.Count())
    })
    }

    protected double denoReservePatientCount(DateTime start, DateTime end, int Year, int Month, int Day, int num)
    {
    return num == 0 ? 0 : 100d * (double)num /
    denoReservePatient(start, end).Where(c => c.RESERVE_TIME.Year == Year && Month == c.RESERVE_TIME.Month && Day == c.RESERVE_TIME.Day
    ).Count();
    }

    protected IQueryable<ReserveSex> denoReservePatient(DateTime start, DateTime end)
            {
                var q = from r in _analysisEntity.RESERVE_TBL
                        join p in _analysisEntity.PATIENT_TBL on r.RS_PATIENT_ID equals
                        p.PB_PATIENT_ID
                        where r.RESERVE_TIME >= start && r.RESERVE_TIME < end && p.BIRTHDAY != null
                        select new ReserveSex { CONTACT = r.CONTACT, NET_RESERVE = r.NET_RESERVE, RESERVE_TIME = r.RESERVE_TIME, RS_PATIENT_ID = r.RS_PATIENT_ID, PB_SEX_ID = p.PB_SEX_ID, BIRTHDAY=p.BIRTHDAY };

    请教一下各位大大,denoReservePatientCount 这个方法其实在表达式树的解析中会出错,报说linq to entites 无法解析这个方法,但是我的sql统计中大量存在 比如denoReservePatientCount的方法,那我该怎么来拼接他呢?
    万分感激~~

    2010年11月23日 7:15

答案

  • 可以在类中定义一个变量

    private IQueryable<ToHosBase> visitorHos;

    然后调用前初始化它

    visitorHos  = _analysisEntity.TOHOSPITAL_TBL.Join(_analysisEntity.CASE_HEAD_TBL, m => m.TOHOSPITAL_ID, n => n.RECEPTION_ID, (m, n) => new ToHosBase { TOHOSPITAL_TIME = m.TOHOSPITAL_TIME, TOHOSPITAL_ID = n.RECEPTION_ID, TH_PATIENT_ID = m.TH_PATIENT_ID });

    然后借用let 作为 条件中的数据来源

                var q = from tohos in
                            getDoctorBreakPatient(start, end).AsExpandable()

                        group tohos by new { tohos.Year, Half = (tohos.Month - 1) / 6 }
                            into gs

                            let denoDoctor = visitorHos.Join(_analysisEntity.CASE_HEAD_TBL, m => m.TOHOSPITAL_ID, n => n.RECEPTION_ID, (m, n) => new { n.DOCTOR_SIGN, n.CH_PATIENT_ID })

                            select new StatisRet
                            {
                                DateTile = new Dates { Year = gs.Key.Year, Half = gs.Key.Half },
                                Group = gs.GroupBy(c => c.EMP_ID).Select(c => new StatisLine
                                {
                                    Id = (int)c.Key,
                                    Count = denoDoctor.Count()

                                }).OrderBy(n => n.Id)

                           };


    Just On Life!
    2011年7月22日 6:15

全部回复

  • try:

     

    protected double denoReservePatientCount(DateTime start, DateTime end, int Year, int Month, int Day, int num)

    {

     int iCount=denoReservePatient(start, end).Where(c => c.RESERVE_TIME.Year == Year && Month == c.RESERVE_TIME.Month && Day == c.RESERVE_TIME.Day

    ).Count();

    return num == 0 ?0:iCount==0? 0 : (100d * (double)num /iCount);

    }

    2010年12月2日 5:43
  • 不行的,执行不了
    Just On Life!
    2011年7月15日 15:09
  • 試試這樣。

    double cnt = denoReservePatientCount(start, end, d.Key.Year, d.Key.Month, d.Key.Day, d.Count());
    
    from tohos in
    orgCancel(start, end)
    group tohos by new { tohos.RESERVE_TIME.Year, Half = (tohos.RESERVE_TIME.Month - 1) / 6 }
    into gs
    select new
    {
    gs.Key,
    Group = gs.GroupBy(c => new
    {
    c.RESERVE_TIME.Year,
    c.RESERVE_TIME.Month,
    c.RESERVE_TIME.Day
    }
    ).Select(d => new
    {
    d.Key,
    Count = cnt
    })
    }
    



    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年7月19日 13:34
  • Terry ,

    这样仍然不行,仍然报不支持xx方法。以我的感觉,认为归根结底,linq to entities 不支持自定义的方法(集合查询方法除外就如orgCancel(start, end)),

    呵呵,我试了一些方式,虽然不支持方法,但是我们可以定义成变量,那就可以用在查询语句中了,虽然不如方法可以使用参数那么方便,但是似乎没有更好的办法了。

    还有,Terry,还有些问题想请教和交流,不知如何与你联系比较好?~~

    谢谢


    Just On Life!
    2011年7月21日 8:23
  • Terry ,

    这样仍然不行,仍然报不支持xx方法。以我的感觉,认为归根结底,linq to entities 不支持自定义的方法(集合查询方法除外就如orgCancel(start, end)),

    呵呵,我试了一些方式,虽然不支持方法,但是我们可以定义成变量,那就可以用在查询语句中了,虽然不如方法可以使用参数那么方便,但是似乎没有更好的办法了。

    还有,Terry,还有些问题想请教和交流,不知如何与你联系比较好?~~

    谢谢


    Just On Life!

    不妨把你的做法貼上來跟大家分享。

    歡迎至我的BLOG上來互相討論,謝謝。


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年7月21日 9:05
  • 可以在类中定义一个变量

    private IQueryable<ToHosBase> visitorHos;

    然后调用前初始化它

    visitorHos  = _analysisEntity.TOHOSPITAL_TBL.Join(_analysisEntity.CASE_HEAD_TBL, m => m.TOHOSPITAL_ID, n => n.RECEPTION_ID, (m, n) => new ToHosBase { TOHOSPITAL_TIME = m.TOHOSPITAL_TIME, TOHOSPITAL_ID = n.RECEPTION_ID, TH_PATIENT_ID = m.TH_PATIENT_ID });

    然后借用let 作为 条件中的数据来源

                var q = from tohos in
                            getDoctorBreakPatient(start, end).AsExpandable()

                        group tohos by new { tohos.Year, Half = (tohos.Month - 1) / 6 }
                            into gs

                            let denoDoctor = visitorHos.Join(_analysisEntity.CASE_HEAD_TBL, m => m.TOHOSPITAL_ID, n => n.RECEPTION_ID, (m, n) => new { n.DOCTOR_SIGN, n.CH_PATIENT_ID })

                            select new StatisRet
                            {
                                DateTile = new Dates { Year = gs.Key.Year, Half = gs.Key.Half },
                                Group = gs.GroupBy(c => c.EMP_ID).Select(c => new StatisLine
                                {
                                    Id = (int)c.Key,
                                    Count = denoDoctor.Count()

                                }).OrderBy(n => n.Id)

                           };


    Just On Life!
    2011年7月22日 6:15