C# Linq查询不是';当它应该返回任何值时,它不会返回任何值

C# Linq查询不是';当它应该返回任何值时,它不会返回任何值,c#,mysql,linq,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 3 3 5 3 6 3 7

我有下表:

Track ---------------------- FromStop ToStop 2 3 3 5 3 6 3 7 3 8 5 7 5 8 6 8 7 8 8 9 跟踪 ---------------------- 从头到尾 2 3 3 5 3 6 3 7 3 8 5 7 5 8 6 8 7 8 8 9 每个数字代表一个车站,本表中的一个条目代表两个车站之间的轨道线

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

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;
    }
}
public List GetClosestConnectingStops(int-fromStopId,int-toStopId)
{
使用(TrainBlockSenties objContext=new TrainBlockSenties())
{
列表跟踪列表;
//2站
var x=从objContext.Tracks中的n开始
其中(n.FromStop==fromStopId&&n.ToStop==toStopId)
//1开关
||(n.FromStop==toStopId&&n.ToStop==fromStopId)
选择n;
trackList=x.ToList();
如果(trackList.Count>0)
{
列表停止=新建列表();
if(轨迹列表[0].Stop.Id==fromStopId){
停止。添加(轨迹列表[0]。停止);
stops.Add(轨迹列表[0].Stop1);
}否则{
stops.Add(轨迹列表[0].Stop1);
停止。添加(轨迹列表[0]。停止);
}
返回站;
}
//3站
变量y=从objContext.Tracks中的n开始
从objContext.Tracks中的n2开始
其中(n.FromStop==fromStopId&&n.ToStop==n2.FromStop&&n2.ToStop==toStopId)
//2个开关
||(n.FromStop==fromStopId&&n.ToStop==n2.ToStop&&n2.FromStop==toStopId)
//1开关
||(n.ToStop==fromStopId&&n.FromStop==n2.FromStop&&n2.ToStop==toStopId)
//2个开关
||(n.ToStop==fromStopId&&n.FromStop==n2.ToStop&&n2.FromStop==toStopId)
选择新的StopConcat
{
出发站,
中间层1=n2.停止,
ArrivalStop=n2.Stop1
};
列表选项=y.ToList();
如果(options.Count>0)
{
Stop[]stops={options[0]。DepartureStop,options[0]。Intermediate1,options[0]。ArrivalStop};
返回停止。ToList();
}
//4站(0)
{
StopConcat firstOption=选项[0];
ArrayList停止=新建ArrayList();
if(firstOption.DepartureStop.Id==fromStopId){
stops.Add(firstOption.DepartureStop);
stops.Add(firstOption.Intermediate1);
}
其他的
{
stops.Add(firstOption.Intermediate1);
stops.Add(firstOption.DepartureStop);
}
if(firstOption.ArrivalStop.Id==toStopId)
{
stops.Add(firstOption.Intermediate2);
stops.Add(firstOption.ArrivalStop);
}
其他的
{
stops.Add(firstOption.ArrivalStop);
stops.Add(firstOption.Intermediate2);
}
返回停止.Cast().ToList();
}
返回null;
}
}
代码示例:

- GetClosestConnectingStops(2,5) -> {2,3,5} - GetClosestConnectingStops(3,5) -> {3,5} -GetCloseStConnectionStops(2,5)->{2,3,5} -GetClosestConnectionStops(3,5)->{3,5} 上面的示例是有效的,但是当我尝试将两个站点与两个其他站点连接在一起时,函数返回null

Expected result: - GetClosestConnectingStops(2,9) -> {2,3,8,9} Actual result - GetClosestConnectingStops(2,9) -> null 预期结果: -GetClosestConnectionStops(2,9)->{2,3,8,9} 实际结果 -GetCloseStConnectionStops(2,9)->null
我的第三个Linq查询有问题,但我无法找出问题所在。

这里介绍的是图形中的路径检测。假设你的图形不像示例中那样大,我建议创建一个图形数据结构,将数据从数据库加载到数据库中,然后使用已知的算法遍历图形,比如寻找最短路径。我曾考虑过使用Dijkstra的算法,但我以前从未使用过,所以我不确定如何合并它。我也是Linq的新手,所以任何例子都非常感谢。看看这个。有一个答案提到了一个可能为您处理所有工作的库。您的实现似乎归结为对特殊情况的分析。如果您使用一些常见的“最短路径”算法,您将更容易获得更可靠的结果,例如。