【问题标题】:Method has no supported translation to SQL方法没有支持的 SQL 转换
【发布时间】:2014-02-19 00:17:40
【问题描述】:

我的项目正在使用 MVC 4 C# LINQ to SQL。

由于某种原因,用于获取我的一个属性的数据的方法给出了“没有支持的 SQL 转换”错误。获取此数据的方法与同一查询中的另一个属性的方法几乎相同,除了一个有效的方法抓取一个字符串,其中一个没有小数点。

确切的错误代码:

Method 'System.Decimal GetModelDifficulty(System.String)' has no supported translation to SQL.

我尝试了以下代码的多种变体,但总是遇到与上面相同的错误:

public List<ProductionSchedule> GetBaseProductionSchedule(DateTime selectedDate)
    {
        var spaList = (from x in db.WO010032s
                       join y in db.MOP1042s on x.MANUFACTUREORDER_I equals y.MANUFACTUREORDER_I into x_y
                       where x.STRTDATE == selectedDate && (x.MANUFACTUREORDERST_I == 2 || x.MANUFACTUREORDERST_I == 3)

                       from y in x_y.DefaultIfEmpty()
                       select new ProductionSchedule()
                       {
                           MO = x.MANUFACTUREORDER_I,
                           BOMNAME = x.BOMNAME_I,
                           SpaModel = x.ITEMNMBR,
                           MoldType = GetMoldType(x.ITEMNMBR.Trim()),
                           SerialNumber = y.SERLNMBR,
                           Difficulty = GetModelDifficulty(x.ITEMNMBR.Trim())
                       }).OrderByDescending(x => x.Difficulty).ToList();

        return spaList;
    }

    public string GetMoldType(string model)
    {
        return db.SkuModelDatas.Where(x => x.Value == model).Select(x => x.MoldType).FirstOrDefault();
    }

    public decimal GetModelDifficulty(string model)
    {
        return (decimal)db.SkuModelDatas.Where(x => x.Value == model).Select(x => x.Difficulty).FirstOrDefault();
    }

【问题讨论】:

  • 奇怪 - 我相信(GetModelDifficultyGetMoldType)都应该给你同样的错误,因为方法调用不能被翻译成 SQL...
  • 嗯,奇怪,我相信我之前已经使用过很多次了。此外,我还测试了注释 GetModelDifficulty 方法并将其设置为 0,然后即使 GetMoldType 方法保持不变,查询也会毫无问题地执行。
  • SkuMOdelData.Difficulty 的类型是什么?你为什么要把它转换成十进制?
  • SkuModelData.Difficulty 的类型是十进制吗?但是模型对象需要十进制,所以我必须将它从它的可为空状态转换。我还尝试在 GetModelDifficulty 方法中查询该值,如果为 null,则返回 0M,如果不是,则返回该值,但额外的逻辑似乎没有任何区别。
  • 是 SkuModelDatas.Value 是 dbml 中的 system.string 类型。

标签: c# linq linq-to-sql


【解决方案1】:

好吧,我已经对代码进行了足够多的调整,直到我偶然发现了一个可行的变体:

public List<ProductionSchedule> GetBaseProductionSchedule(DateTime selectedDate)
    {
        var spaList = (from x in db.WO010032s
                       join y in db.MOP1042s on x.MANUFACTUREORDER_I equals y.MANUFACTUREORDER_I into x_y
                       where x.STRTDATE == selectedDate && (x.MANUFACTUREORDERST_I == 2 || x.MANUFACTUREORDERST_I == 3)

                       from y in x_y.DefaultIfEmpty()
                       select new ProductionSchedule()
                       {
                           MO = x.MANUFACTUREORDER_I,
                           BOMNAME = x.BOMNAME_I,
                           SpaModel = x.ITEMNMBR,
                           MoldType = GetMoldType(x.ITEMNMBR.Trim()),
                           SerialNumber = y.SERLNMBR,
                           Difficulty = GetModelDifficulty(x.ITEMNMBR)
                       }).ToList();

        return spaList.OrderByDescending(x => x.Difficulty).ToList();
    }

    public string GetMoldType(string model)
    {
        return db.SkuModelDatas.Where(x => x.Value == model).Select(x => x.MoldType).FirstOrDefault();
    }

    public decimal GetModelDifficulty(string model)
    {
        decimal difficulty = (String.IsNullOrEmpty(model)) ? 0M : Convert.ToDecimal(db.SkuModelDatas.Where(x => x.Value == model.Trim()).Select(x => x.Difficulty).FirstOrDefault());
        return difficulty;
    }

为什么它在一种方法中捕获 x.ITEMNMBR(模型参数)的空字符串时起作用,而不是另一种方法,并且需要在主 LINQ 查询之外进行 OrderByDescending,我不知道。

感谢所有建议和帮助。

【讨论】:

    【解决方案2】:

    问题是您的查询正在调用 LINQ 无法转换为 SQL 的代码。

    先试试这个,可能会有帮助。您的(decimal) 演员表可能有问题。将您的方法GetModelDifficulty 修改为以下内容:

        public decimal GetModelDifficulty(string model)
        {
            return Convert.ToDecimal(db.SkuModelDatas.Where(x => x.Value == model).Select(x => x.Difficulty).FirstOrDefault());
        }
    

    如果这不起作用,恐怕您将不得不进一步分解您的查询以缩小问题范围。使用此处提供的文档:Standard Query Operator Translation (LINQ to SQL) 确保您使用的任何扩展方法都支持翻译。

    如果您遇到一段无法翻译的代码,您可能需要声明一个单独的变量,其中已经存储了必要的值,然后您可以在查询中使用该变量。

    【讨论】:

    • 尝试转换而不是强制转换的好主意。不幸的是,这似乎产生了与以前相同的错误。
    【解决方案3】:

    我认为这是因为您对 FirstOrDefault() 的调用可以返回一个空值。当您分配给类型化对象时,您可以使用 ?运算符表示它可以为空:

    decimal? myDec = <some code returning decimal value or null>
    

    然后您可以通过以下方式检查 myDec 是否为空:

    myDec.HasValue
    

    【讨论】:

    • 不是真的,因为它不能翻译成查询。
    • 我尝试过捕获 null 值并让方法返回 0M 而不是 null 否则返回值,但不幸的是它似乎没有什么不同。
    猜你喜欢
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多