调试复杂的 linq 查询

Cem*_*mre 3 c# linq debugging visual-studio-2013

我正在处理一个复杂的linq查询,如下所示,它System.NullReferenceException在运行时引发。不幸的是,visual studio 不提供任何其他信息,我无法QuickWatch对这些值进行检查以查看哪个为空。有没有办法调试这种查询,以便我可以看到有什么问题?

var dataSource = (from c in session.Query<PortChannel>()
        select
            new PortChannelData
            {
                Location = c.Port.MagazineSlot.SiteMagazine.Site.SiteName,
                MagazineName =
                    String.Format("{0}-{1}", c.Port.MagazineSlot.SiteMagazine.MagazineType.MagazineName,
                        c.Port.MagazineSlot.SiteMagazine.MagazineNo),
                SlotNo = c.Port.MagazineSlot.SlotNo,
                PortNo = c.Port.PortNo,
                Klm = c.Klm,
                StmNo = c.StmNo,
                Label = c.SiteName == null ? null : String.Format("{0}_{1}", c.SiteName, c.E1No),
                ChannelFullName = c.ChannelFullName,
                BscRncPort = c.BscRncPort,
                MgwPort = c.MgwPort,
                ReservedBy = c.ReservedBy,
                CrossFullName = c.CrossConnection == null ? null : c.CrossConnection.ChannelFullName
            }).ToList();
}
Run Code Online (Sandbox Code Playgroud)

Pio*_*ski 5

在您的查询中,您可以使用let关键字来存储子表达式的结果。然后在创建新PortChannelData对象时分配结果。

var dataSource = 
    (from c in session.Query<PortChannel>()
        let flName = c.CrossConnection == null ? null : c.CrossConnection.ChannelFullName
        let magName = String.Format("{0}-{1}", c.Port.MagazineSlot.SiteMagazine.MagazineType.MagazineName,
                    c.Port.MagazineSlot.SiteMagazine.MagazineNo)
        // and so on
        select new PortChannelData
        {
            MagazineName = magName,
            CrossFullName = flName,
            // ...
        }).ToList();
Run Code Online (Sandbox Code Playgroud)

这样,当您调试并进入查询(F11是标准的 Visual Studio 快捷方式)时,您将看到每个子表达式的结果。