【问题标题】:What does this LINQ to SQL error mean?这个 LINQ to SQL 错误是什么意思?
【发布时间】:2011-07-13 12:17:42
【问题描述】:

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

【问题讨论】:

  • 错误是执行LINQ查询时,你确定Contract_Number总是包含空格吗?

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


【解决方案1】:

如果您的字符串中没有任何' ',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。

【讨论】:

  • 啊,我明白了,有些合同号没有空格。有什么办法可以解决这个问题吗?
  • @Chris,您需要在使用 IndexOf 和 Substring 之前检查答案是否包含空格,请参阅更新的答案。
【解决方案2】:

我通过使用固定长度的子字符串解决了这个问题。

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

【讨论】:

    猜你喜欢
    • 2012-05-16
    • 2016-03-24
    • 2010-12-05
    • 1970-01-01
    • 2018-11-29
    相关资源
    最近更新 更多