2014-02-19 54 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,否則返回值,但它似乎並沒有不幸的差異。 –

相關問題