这个LINQ to SQL错误是什么意思?

时间:2011-03-11 13:33:56

标签: c# asp.net sql linq-to-sql

由于某种原因,我在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'行

2 个答案:

答案 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);