我发现在查询列表时使用Linq是一种有用的体验,并提供了简洁易读的代码。
我发现的问题是,当发生错误时,很难调试查询的哪一部分失败。
有没有办法找到这个?它只是突出显示整个查询并返回错误。
一个例子是如果我有一个列表:
class Person
{
public IList<string> Pets
{
// please, don't do this at home :)
get { throw new InvalidOperationException(); }
}
}
Person person = new Person();
List<Person> myStrings = new List<Person>();
myStrings.Add(person);
var people = from p in myStrings
where p.Pets.Count > 0
select p;
显然,检查null是一个简单的解决方案,但对于更复杂的错误(也可能不那么明显),我们应该如何找到查询失败的位置?
是否有Linq探查器或什么?
答案 0 :(得分:4)
您可以将Visual Studio设置为中断所有异常,并在lambda中抛出异常后立即中断。
这也可以发现微妙的错误;我高度推荐它 但是,对于旧的,带有异常的代码,这将是一场噩梦。
答案 1 :(得分:-1)
Person person = new Person();
person.Pets = null;
List<Person> myStrings = new List<Person>();
myStrings.Add(person);
var people = from p in myStrings
let pets = p.Pets
where pets != null && pets.Count > 0
select p;
如果人们认为这不重复,我很抱歉。它是。
问题始终是打破你的表达,寻找你没有提前考虑的空的东西。与任何其他复杂表达式一样,问题与LINQ查询和lambda表达式没有什么不同。将它分解,将碎片放在不同的行上,然后确切地找到它所在的行。
在Visual Studio 2010中这不太难: