Linq查询不应该返回任何值

时间:2015-05-13 13:44:46

标签: c# mysql linq

我有下表:

Track
----------------------
FromStop  ToStop
2         3
3         5
3         6
3         7
3         8
5         7
5         8
6         8
7         8
8         9

每个数字代表一个电台,此表中的一个条目代表两个电台之间的一条轨道。

我编写了以下代码来确定2个站点之间的其他站点:

public List<Stop> GetClosestConnectingStops(int fromStopId, int toStopId)
{
    using (TrainBlocksEntities objContext = new TrainBlocksEntities())
    {
        List<Track> trackList;

        //2 stops
        var x = from n in objContext.Tracks
                where (n.FromStop == fromStopId && n.ToStop == toStopId) 
                //1 switches
                || (n.FromStop == toStopId && n.ToStop == fromStopId)
                select n;
        trackList = x.ToList<Track>();
        if (trackList.Count > 0)
        {
            List<Stop> stops = new List<Stop>();
            if(trackList[0].Stop.Id == fromStopId){
                stops.Add(trackList[0].Stop);
                stops.Add(trackList[0].Stop1);
            }else{
                stops.Add(trackList[0].Stop1);
                stops.Add(trackList[0].Stop);
            }
            return stops;
        }

        //3 stops
        var y = from n in objContext.Tracks
                from n2 in objContext.Tracks
                where (n.FromStop == fromStopId && n.ToStop == n2.FromStop && n2.ToStop == toStopId)
                //2 switches
                || (n.FromStop == fromStopId && n.ToStop == n2.ToStop && n2.FromStop == toStopId)
                //1 switch
                || (n.ToStop == fromStopId && n.FromStop == n2.FromStop && n2.ToStop == toStopId)
                    //2 switches
                || (n.ToStop == fromStopId && n.FromStop == n2.ToStop && n2.FromStop == toStopId)
                select new StopConcat
                {
                    DepartureStop = n.Stop,
                    Intermediate1 = n2.Stop,
                    ArrivalStop = n2.Stop1
                };
        List<StopConcat> options = y.ToList<StopConcat>();
        if (options.Count > 0)
        {
            Stop[] stops = {options[0].DepartureStop, options[0].Intermediate1, options[0].ArrivalStop};
            return stops.ToList<Stop>();
        }

        //4 stops <---- THIS DOESNT WORK
        var z =
            from n in objContext.Tracks
            from n2 in objContext.Tracks
            from n3 in objContext.Tracks
            where 
               (n.FromStop == fromStopId && n2.FromStop == n.ToStop && n3.FromStop == n2.ToStop && n3.ToStop == toStopId)
            //3 switches
            || (n.FromStop == fromStopId && n2.FromStop == n.ToStop && n3.ToStop == n2.ToStop && n3.FromStop == toStopId)
            //2 switches
            || (n.FromStop == fromStopId && n2.ToStop == n.ToStop && n3.FromStop == n2.FromStop && n3.ToStop == toStopId)
                //3 switches
            || (n.FromStop == fromStopId && n2.ToStop == n.ToStop && n3.ToStop == n2.FromStop && n3.FromStop == toStopId)
            //1 switch
            || (n.ToStop == fromStopId && n2.FromStop == n.FromStop && n3.FromStop == n2.ToStop && n3.ToStop == toStopId)
                //3 switches
            || (n.ToStop == fromStopId && n2.FromStop == n.FromStop && n3.ToStop == n2.ToStop && n3.FromStop == toStopId)
                //2 switches
            || (n.ToStop == fromStopId && n2.ToStop == n.FromStop && n3.FromStop == n2.FromStop && n3.ToStop == toStopId)
                    //3 switches
            || (n.ToStop == fromStopId && n2.ToStop == n.FromStop && n3.ToStop == n2.FromStop && n3.FromStop == toStopId)
            select new StopConcat
            {
                DepartureStop = n.Stop,
                Intermediate1 = n.Stop1,
                Intermediate2= n3.Stop,
                ArrivalStop = n3.Stop1
            };
        options = z.ToList<StopConcat>();
        if (trackList.Count > 0)
        {
            StopConcat firstOption = options[0];
            ArrayList stops = new ArrayList();
            if(firstOption.DepartureStop.Id == fromStopId){
                stops.Add(firstOption.DepartureStop);
                stops.Add(firstOption.Intermediate1);
            }
            else
            {
                stops.Add(firstOption.Intermediate1);
                stops.Add(firstOption.DepartureStop);
            }
            if (firstOption.ArrivalStop.Id == toStopId)
            {
                stops.Add(firstOption.Intermediate2);
                stops.Add(firstOption.ArrivalStop);
            }
            else
            {
                stops.Add(firstOption.ArrivalStop);
                stops.Add(firstOption.Intermediate2);
            }

            return stops.Cast<Stop>().ToList();
        }

        return null;
    }
}

代码示例:

 - GetClosestConnectingStops(2,5) -> {2,3,5}
 - GetClosestConnectingStops(3,5) -> {3,5}

以上示例有效,但当我尝试连接2个站点和其他2个站点时,该函数返回null。

Expected result:
 - GetClosestConnectingStops(2,9) -> {2,3,8,9}
Actual result
 - GetClosestConnectingStops(2,9) -> null

我的第三个Linq查询有问题,但我无法弄清楚是什么。

0 个答案:

没有答案