2010-06-18 65 views
2

希望这是一个星期五的问题的一个很好的垒球,但我有下面的代码行:需要一个LINQ ArgumentOutOfRangeException帮助C#

//System.ArgumentOutOfRangeException generated if there is no matching data 
currentAnswers = new CurrentAnswersCollection() 
    .Where("PARTICIPANT_ID", 10000).Load()[0]; 

CurrentAnswersCollection是一个强类型集合视图所填充回到我的数据库。 问题当然是,如果没有相应的PARTICIPANT_ID = 10000,我会收到错误消息。

有没有更好的方法来写这个,所以我根本得不到错误信息? 我只是不太了解LINQ语法,知道我是否可以先测试这个存在?

谢谢。

+0

调查堆栈跟踪。它通常会给出非常精确的错误位置。 – Andrey 2010-06-18 14:12:56

+0

如果您使用动态LINQ,您可以尝试将'.Where'表达式更改为'.Where(“PARTICIPANT_ID = @ p0”,10000)''。但要回答关于ArgumentOutOfRangeException的问题,请参阅David M的回答 – 2010-06-18 14:44:18

回答

7

使用此:

currentAnswers = new CurrentAnswersCollection() 
    .Where("PARTICIPANT_ID", 10000).Load() 
    .FirstOrDefault(); 

它会返回null,如果没有第一要素。

但是您可能需要先修复您的代码(此处复制) - .Where语法看起来不太可靠。

+0

您是否真的尝试运行此代码?它甚至不应该编译。 .Where需要一个lambda。这里是参考:http://msdn.microsoft.com/en-us/library/bb534803.aspx – 2010-06-18 14:22:22

+0

非常正确 - 直到.FirstOrDefault,这只是OP的代码返回给他。 – 2010-06-18 14:25:02

+1

@Cylon猫,他可以使用动态LINQ库。 http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx – 2010-06-18 14:30:07

0

您需要.Where中的lambda表达式。

currentAnswers = new CurrentAnswersCollection() 
    .Where(c => c.PARTICIPANT_ID == 10000).Load().FirstOrDefault(); 
+1

他的代码似乎工作,除非没有项目返回。 “Lambda”不是问题,“[0]”是。 – ANeves 2010-06-18 14:14:53

+0

这个问题有两个部分,缺少==和例外。赛龙猫回答了==部分。 – 2010-06-18 14:19:23

+0

@ANeves,“似乎工作”? IEnumerable的每个重载.Where()都需要一个委托。没有办法。当第一个参数是一个字符串时,哪里可以工作。 – 2010-06-18 14:19:59

0

尝试:

var answers = new CurrenAnswersCollection().Where("PARTICIPANT_ID", 10000); 
if(answers.Count() >= 1) currentAnswers = answers.Load()[0]; 

或类似的东西。