繁体   English   中英

方法不支持翻译成SQL

[英]Method has no supported translation to SQL

我的项目正在使用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();
    }

好吧,我已经将代码调整了足够多的时间,直到我偶然发现了一个可行的版本:

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时为何起作用,我不知道。

感谢您的所有建议和帮助。

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

首先尝试一下,可能会有所帮助。 您的(decimal)可能存在问题。 将您的方法GetModelDifficulty修改为以下内容:

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

如果这样不起作用,恐怕您将不得不进一步细分查询以缩小问题范围。 使用此处提供的文档: 标准查询运算符转换(LINQ to SQL) ,以确保您使用的任何扩展方法都支持翻译。

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

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

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

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

myDec.HasValue

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM