Что означает эта ошибка LINQ to SQL? - PullRequest
2 голосов
/ 11 марта 2011

По какой-то причине я получаю приведенную ниже ошибку в моем проекте на C # / ASP.NET - возможно, это связано с частью запроса в виде подстроки. Однако '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 ]

7 голосов
/ 11 марта 2011

Если в вашей строке нет ' ' 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);

Если вы предпочитаете троичный оператор , который также может быть использован.

Если вы используетеLinq2Objects вы можете использовать s.Contract_Number.Split().First(), но LINQ не может перевести это в SQL.

0 голосов
/ 11 марта 2011

Я решил эту проблему, используя подстроку фиксированной длины.

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);
...