2014-02-19 29 views
1

我的项目使用MVC 4 C#LINQ to SQL。方法没有支持转换到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(); 
    } 
+3

奇怪 - 我相信这两个('GetModelDifficulty'和'GetMoldType')应该给你同样的错误,因为方法调用不能被转换为SQL ... –

+0

嗯奇怪我已经用了很多次之前我相信。此外,我测试了GetModelDifficulty方法的注释,并将其设置为0,即使GetMoldType方法保持不变,查询也可以毫无问题地执行。 –

+0

“SkuMOdelData.Difficulty”的类型是什么?你为什么要把它转换成十进制? – Moho

回答

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(模型参数),而不是和其他需要到OrderByDescending主要LINQ阙外工作我不知道。

感谢所有的建议和帮助。

-1

的问题是你的查询调用代码那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)以确保您使用的任何扩展方法都支持翻译。

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

+0

尝试转换而不是转换的好主意。不幸的是,这似乎产生了与以前相同的错误。 –

-2

我想这是因为你对FirstOrDefault()的调用可以返回一个空值。当你分配到一个类型的对象,你可以使用?运营商表示,它可以为null:

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

然后你就可以检查是否myDec为空或不:

myDec.HasValue 
+0

不是,这是因为它不能被翻译成查询。 –

+0

我试过陷阱的空值,并有方法返回0M而不是null,否则返回值,但它似乎并没有不幸的差异。 –

相关问题