由于某种原因,我在C#/ ASP.NET项目中遇到以下错误 - 可能是它与查询的SubString部分有关。但是,“SageJobNo”和“CutOffDate”总是被填充。
错误:
传递给LEFT或SUBSTRING函数的长度参数无效。
代码如下:
IEnumerable<CcsVwICATimesheet> Timesheets = (from s in SageDC.CcsVwICATimesheets where s.Contract_Number.Substring(0, s.Contract_Number.IndexOf(" ")) == SageJobNo && s.Timesheet_Date <= CutOffDate select s);
foreach (CcsVwICATimesheet Timesheet in Timesheets)
{
LabourCosts += (double)Timesheet.Cost_Value;
}
编辑:错误发生在'foreach'行
答案 0 :(得分:7)
如果您的字符串IndexOf
中没有任何' '
,则返回-1,而子字符串将失败。
修改强>
您可以通过检查字符串是否包含" "
来保护。
IEnumerable<CcsVwICATimesheet> Timesheets =
(from s in SageDC.CcsVwICATimesheets
where
(
(s.Contract_Number.Contains(" ") && s.Contract_Number.Substring(0, s.Contract_Number.IndexOf(" ")) == SageJobNo)
||
(!s.Contract_Number.Contains(" ") && s.Contract_Number == SageJobNo)
)
&& s.Timesheet_Date <= CutOffDate select s);
如果您更喜欢可以使用的ternary operator。
如果您使用Linq2Objects,则可以使用s.Contract_Number.Split().First()
,但LINQ无法将其转换为SQL。
答案 1 :(得分:0)
我通过使用固定长度的子字符串解决了这个问题。
IEnumerable<CcsVwICAPurchase> Purchases = (from s in SageDC.CcsVwICAPurchases where s.Contract_Number.Substring(0, Global.SageJobNoLength).Trim() == SageJobNo && s.Line_Type == "Materials" && s.Document_Date <= CutOffDate select s);