简体   繁体   English

如何从linq查询中调用本地方法

[英]How to call a local method from the linq query

In my web api i need to execute a method from linq query itself. 在我的Web API中,我需要从linq查询本身执行一个方法。 My linq query code snippet belongs to method is shown below which calls local method to get required data. 我的linq查询代码片段属于method,如下所示,它调用local方法来获取所需的数据。

var onlineData = (from od in db.RTLS_ONLINEPERSONSTATUS
                  let zoneIds = db.RTLS_PERSONSTATUS_HISTORY.Where(p => p.person_id == od.PERSONID).OrderByDescending(z => z.stime > startOfThisDay && z.stime < DateTime.Now).Select(z => z.zone_id).ToList()

                  let zoneIdsArray = this.getZoneList((zoneIds.ToArray()))
                  let fzones = zoneIdsArray.Select(z => z).Take(5)
                  select new OnlineDataInfoDTO
                  {
                      P_ID = od.PERSONID,
                      T_ID = (int)od.TAGID,
                      LOCS = fzones.ToList()
                  }

public int[] getZoneList(decimal[] zoneIdsArray)
    {
        int[] zoneIds = Array.ConvertAll(zoneIdsArray, x => (int)x);
        List<int> list = zoneIds.ToList();
        for (int c = 1; c < zoneIdsArray.Count(); c++)
        {
            if (zoneIdsArray[c] == zoneIdsArray[c - 1])
            {
                list.Remove((int)zoneIdsArray[c]);
            }
        }
        return list.ToArray();
    }

I am getting exception at let zoneIdsArray = this.getZoneList((zoneIds.ToArray())), is there any way to solve this problem. 我在let zoneIdsArray = this.getZoneList((zoneIds.ToArray()))处遇到异常,有什么办法可以解决此问题。 I got logic to solve my problem from this link( Linq query to get person visited zones of current day ), the given logic is absolutely fine for my requirement but i am facing problem while executing it. 我从该链接( Linq查询以使人访问当天的区域)中得到解决问题的逻辑,给定的逻辑对我的要求来说绝对合适,但是我在执行它时面临问题。

One way to achieve that would be to perform the projection on the client instead of the underlying LINQ provider. 一种实现方法是在客户端而不是底层的LINQ提供程序上执行投影。 This can be done by separating your query into 2 steps: 可以通过将查询分为两个步骤来完成此操作:

var peopleStatus =
    from od in db.RTLS_ONLINEPERSONSTATUS
    let zoneIds = db.RTLS_PERSONSTATUS_HISTORY
        .Where(p => p.person_id == od.PERSONID)
        .OrderByDescending(z => z.stime > startOfThisDay && z.stime < DateTime.Now)
        .Select(z => z.zone_id)
        .ToList()
    select new
    {
        Person = od,
        ZoneIds = zoneIds,
    };

var onlineData =
    from od in peopleStatus.ToList()
    let zoneIdsArray = this.getZoneList((od.ZoneIds.ToArray()))
    let fzones = zoneIdsArray.Select(z => z).Take(5)
    select new OnlineDataInfoDTO
    {
        P_ID = od.Person.PERSONID,
        T_ID = (int)od.Person.TAGID,
        LOCS = fzones.ToList()
    };

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM